标准“安装”实际上做了啥?

Posted

技术标签:

【中文标题】标准“安装”实际上做了啥?【英文标题】:What Does a Standard "Installation" actually do?标准“安装”实际上做了什么? 【发布时间】:2010-12-10 09:30:30 【问题描述】:

我或多或少只是一个业余程序员,并且在 .NET ClickOnce 世界中以编码方式长大。

当一个人“安装”一个程序时,实际发生了什么?!

另外:一些小应用程序/工具只是从 exe 运行。为什么大多数程序都需要花哨的安装过程?有什么优点,缺点,优点和缺点?安装通常是必要的还是更像是标准做法?

对于额外的问题,我们深表歉意。我只是希望有一个通俗易懂的或多或少的外行对关键因素的解释。

【问题讨论】:

【参考方案1】:

取决于您正在安装的程序。 “安装”的范围可以从简单地将(相对较小的)可执行文件复制到目录,设置共享库,进行补丁级别检查(我设计为在 SP2 或更高版本上运行 - 我是否有 SP2 或更高版本?)和更改系统配置,适用于当前用户或所有用户。他们中的大多数还使用包管理器注册安装,以便您以后可以轻松卸载。

【讨论】:

有些程序还包括注册表更改或其他更改。 IronRuby 的安装程序设置文件,NGEN 是机器上的文件,并设置 %PATH% 以包含 IronRuby 的可执行文件以供命令行使用。 我想我已经用“更改系统配置”覆盖了那个 - 试图使其尽可能与系统无关。 谢谢马丁,它有助于填写图片。顺便说一句,你的签名图片让我想起了几年前我在大学看到的一张汽车贴纸:“我是山人,我爱山女。”有点跑题了,但无论如何...... Gregg ...我姓氏中的“berg”部分在德语中的意思是“山”...而且我恰好学过日语,所以这对我来说很容易跨度> 【参考方案2】:

Wikipedia tells us 典型的安装程序会创建或修改以下内容:

共享和非共享程序文件 文件夹/目录 Windows 注册表项(仅限 Windows) 配置文件条目 环境变量 链接或快捷方式

因此,如果您的程序需要其中一项或多项修改,您应该创建一个安装程序来完成这项工作。

【讨论】:

嗨 Moayad,感谢您抽出宝贵的时间。我仍然没有真正看到所有这些东西都需要安装程序,但我想有些东西确实需要。【参考方案3】:

使用“花哨”安装过程的原因

    记录安装过程 因此可以重播(修复)或 撤消(卸载) 执行简单文件复制之外的操作(创建注册表项、注册组件、执行其他任意操作

大多数安装的“标准”选项将是“通常需要的所有位,在标准位置,例如 Program Files”安装,无需自定义,可能未启用某些专家级功能。

【讨论】:

【参考方案4】:

您确实看到了很多遗留的原因,这些原因都已成为 Windows 世界的标准做法。

首先,一些对比,因为它并不总是这样。 Mac OS X 中的“应用程序”只是一个内部具有特定结构的目录,以.app 扩展名命名。安装应用程序就像将它(只是应用程序图标)拖到您的应用程序文件夹一样简单,卸载涉及将其拖到垃圾箱。就是这样,(通常)不需要花哨的安装程序。

在 Windows 上,应用程序通常由需要“注册”的独立组件构建。这涉及到安装程序将一些零碎的内容写入 Windows 注册表,以告诉 Windows 在哪里可以找到组件。是的,应用程序可能应该知道在哪里可以找到它们(因为它们都安装在同一个地方),但是多年的传统和连接组件的不同方式使我们取得了今天的成就。

通常是 Windows 上的安装程序:

复制文件 注册组件 设置安全权限(如果适用) 将图标添加到“开始”菜单和/或桌面 向注册表写入更多内容,告诉 Windows 将该程序添加到“添加和删除程序”中

【讨论】:

感谢格雷格的回复。现在,是否可以在第一次运行应用程序时不做任何事情?只是好奇这是必要的还是只是“完成” 确实可以在应用程序的第一次运行时完成大部分操作。然而,安装程序存在的主要原因之一是提供卸载程序。通常,Windows 应用程序需要在文件系统和注册表周围的许多地方编写内容,因此清理它们的唯一好方法是让程序为您完成。 哦,安装时可能需要做的另一件事是任何需要管理员权限的事情。如果有任何此类必需的操作,安装程序将要求以适当的管理员权限运行它。如果没有这个,应用程序的第一次运行可能会作为普通用户帐户运行,并且没有权限执行这些操作。 太棒了!非常感谢您花时间解释这一切;非常感谢。【参考方案5】:

该程序试图修改计算机以使其正常工作并且所有竞争产品都失败。在 Windows 上,这意味着:

修改注册表中的任意键,直到它变慢并充满损坏的条目

用您的软件可以使用的单个旧版本替换 DLL

在尽可能多的地方传播尽可能多的文件

创建卸载脚本以维持用户无需重新安装操作系统即可摆脱软件的错觉。在用户尝试运行此脚本的不太可能的情况下,您可以教育他/她不要再这样做,并提出诸如“该文件....可能被其他应用程序使用。您真的要删除它吗?是/否/也许/任何答案/所有答案都是正确的”

在不起眼的地方安装挂钩,以便您的软件在计算机启动时运行。这可能会减慢启动过程,但您的软件会立即启动,因此您需要付出很小的代价。

做一些花费很长时间但没人知道你在做什么的晦涩难懂的事情(“安装程序正在准备安装”15 分钟做什么?)

检查是否有足够的磁盘空间但使用 32 位整数确保不能安装在 1TB 磁盘上。

一个重要的任务是安装失败并打印错误:“安装失败。这可能是因为安装了防病毒软件。请停用它并重试。”这将确保用户开始不信任他们的防病毒软件(尤其是在第二次运行安装成功时,因为安装程序中的模糊错误没有被触发)并且很多人会忘记再次启用病毒扫描程序或甚至卸载该死的东西。

全世界的病毒作者也是人!垃圾邮件占 Internet 上的大部分流量,这一定意味着它很重要,谁不想成为地球上最大社区的一部分?最重要的是,你可以通过这种方式赚大钱。你只需要一个软弱的良心和/或一些犯罪能量。

安装程序的一个非常重要的部分是增加注册表项HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData\S-7-9-23-64738-1349283462-3754093625-4491\IsYourWindowWideEnough\NotGivenUpYetHuh\GoAway\ImportantSystemInformation\Let See How You Can Handle Spaces\DamnIGottaStopSincePathsCanHaveOnl\ReinstalCtr

这个重要的系统计数器会帮助用户产生不稳定的假象,直到他们强烈要求重新安装整个系统。这将有助于专业 IT 行业销售支持时间、销售新计算机、更多 RAM、更大硬盘或新 Windows 版本(它们必须更好,对吗?)。

注意:如果您认真对待本文,请寻求专业帮助。

【讨论】:

【参考方案6】:

安装程序抽象了部署复杂软件基础架构的过程,通常包含在档案中,通过方便、自给自足的用户界面

此 UI 可以是图形的,也可以基于在命令行上输出的文本,例如 unix shell(例如 bash)。对于图形安装程序,通常使用所谓的安装引导程序,在后一种情况下,安装脚本可以是 bash 脚本、Microsoft 批处理脚本或其他任何在命令行上运行的脚本语言。

最简单的情况中,应用程序只是一个可执行文件,操作系统知道如何处理该文件才能运行它。应用程序文件可能位于包含子文件夹和其他辅助文件的文件夹中,打包到一个档案中。在这种情况下,可能不需要安装程序。

对于复杂的软件,可能需要完整的软件平台和与底层操作系统基础架构的紧密集成,例如强制执行软件产品的版权。 p>

Windows 上的许多安装程序提供 /e/extract 标志。例如setup.exe /e 允许在安装程序不运行其安装脚本的情况下提取存档内容。 我最近只需要that。

心态转变

无论底层软件资产多么简单,安装程序几乎已成为交付专业软件的标准。随着越来越多精通计算机的用户以及将应用程序从一个桌面迁移到另一个桌面的愿望,通常以简单存档的形式交付的便携式软件变得越来越流行。

(我不知道我总共花了多少时间在安装程序上,但肯定是几天的数量级。)

安装程序可能处理的任务是:

解压(通常使用异国情调的高压缩存档器) 确保系统硬件要求 确保有足够的硬盘空间 确保软件平台运行时要求(例如“可再发行组件”) 检查较新的软件更新 从远程存储库下载软件 创建和/或更新程序文件和文件夹 创建配置文件、注册表项或环境变量 安装软件驱动程序,装载或卸载设备 通过解释安装步骤、创建链接、快捷方式来增加日常用户的可访问性 通过书签等方式推广自己的软件... 通过在安装过程中展示软件的关键点,逐张滑动,为用户实际启动软件创造动力 通过软件捆绑创造额外收入 配置内核模块和自动运行组件(例如守护进程、windows-services) 软件自动修补 设置文件夹、文件和用户权限 创建 UUID 引用以将软件耦合到安装实例并防止可移植性

PS:如果你能想到其他的点,请告诉我,我会合并的。

【讨论】:

以上是关于标准“安装”实际上做了啥?的主要内容,如果未能解决你的问题,请参考以下文章

纤维/未来实际上做了啥?

调用 Tk() 实际上做了啥?

Firebase 观察者实际上做了啥?

SecurityInterstitialCommandId.CMD_PROCEED 实际上做了啥?

Android SQLite - SQLiteDatabase.replace() 实际上做了啥?

Android Honeycomb 中的 Bitmap#recycle() 实际上做了啥?