English 中文(简体)
你不认为编写安装程序应该更简单吗? [关闭]
原标题:
  • 时间:2009-03-12 06:28:06
  •  标签:
Closed. This question is opinion-based. It is not currently accepting answers.

想要改进这个问题吗?通过编辑此帖子更新问题,使其能够通过事实和引用回答。

Closed 7 years ago.

最近我不得不努力处理一个安装项目(使用最流行的创建安装的产品:InstallShield),以使其适用于产品升级(从一个版本迁移到另一个版本)。最后结果是我需要使用一个长包代码,但我却在使用其他代码。这浪费了我8个小时(测试和调试安装程序真是痛苦)。

现在如果我想一想,一旦你完成了编码的所有艰难部分,你想要的只是将正确的应用程序,库复制到目标计算机上,用户只需运行它。 这似乎简单的任务通常会变得棘手,“接近完成日期”会使其更加困难。

  1. 你不觉得在Windows上部署产品本应该更简单吗?(或者说安装程序真的值得如此多的关注,我只是对它疯狂了吗?)

  2. 你是否曾经使用过更简单的部署方案,例如“将文件夹复制到任意位置并运行exe文件。当您想要删除它时,只需删除该文件夹!”它是否有效并使事情更简单?

最佳回答

请尽力克服Windows安装程序的困难,为了客户的利益。否则,您将需要做更多的工作。

  1. Handle situations where for some reason an error occurs during the installation. What do you do next?
  2. Handle issues like security. What if the installing user does not have rights to particular folders/registry keys?
  3. Correctly cleanup after installation
  4. Patching and patch management
  5. Performing additional tasks -- registering COM objects, creating databases, creating shortcuts, creating an un-installation shotcut and so on
  6. Installing prerequisites
  7. Letting users choose which features to install

你自己定制的脚本最终解决所有这些问题,比安装本身更成为一个大问题!

我建议您查看Wix。它并非易如反掌,但它可以完成工作。如果您将Votive安装为Visual Studio插件,则可以获得智能感知,以帮助您正确构造标记。通过帮助文件,您可以创建相当功能齐全且灵活的安装程序。

问题回答

我认为在这里不会看到太多的争论,尤其是关于MSI的。我认为要记住的一件事是观察许多程序如何使用MSI文件。由于Windows Installer的设计方式非常弱,因此在使用MSI时显示UI对话框和进行复杂的配置选择是非常弱的,因此我已经注意到很多程序被拆分为一堆婴儿MSI,并通过父设置程序以最小的UI安装。SQL Server 2008设置向导就是这样。 UPS WorldShip也是如此。 Paint.NET也是如此 - 你看到的向导是一个Windows Forms应用程序,它启动 msiexec 本身(您可以看到Windows Installer的最小UI弹出在白色向导窗口的顶部),通过属性参数将任何配置参数传递给 msiexec

这种情况往往出现在某人被委任制作一个安装程序,而此程序既有服务器版本也有客户端版本。如果用户选择了服务器选项,则他们可能需要或者不需要安装一个新的数据库,这意味着需要安装 SQL Server。但是你不能在自己的安装程序进行中执行 SQL Server 的安装,因为Windows安装程序不允许你这样做。因此,一个常见的解决方案是编写一个应用程序,显示一个向导,允许用户配置所有的设置选项。然后,你的应用程序启动所需的 MSI 文件,包括 SQL Server、你的服务器应用程序和客户端应用程序,并将其设置为最小 UI 模式。基本上,完全摒弃 Windows 安装程序的“特性”方面,将其移至 MSI 级别。4.5 的多包安装似乎向这个方向更进了一步。如果你在安装过程中还需要将第三方的非 MSI 安装程序包括在内,例如为某个奇怪的 POS 打印机安装打印机驱动程序,那么这种格式也非常有用。

我也同意Windows Installer缺乏通用部署方案的内置支持。它的用途是为非XCOPY安装而设计的,但他们似乎忽视了一点,那就是安装通常不仅仅是“文件+快捷方式+注册表键”。没有内置的操作来设置IIS网站、注册证书、创建和更新数据库、将程序集添加到GAC等等。我想他们认为一些任务应该在第一次运行时发生,而不是作为安装的事务性部分。自由可得的工具和文档在过去十年中一直非常糟糕——非常糟糕。WiX项目和DTF(可以让您最终使用托管代码定制操作)基本上解决了这两个问题,这就是为什么我们非常感激Rob Mensching和其他人在那个项目上的工作。

我有同样的经历。安装过程会让你花费很多时间,因为你会陷入“哦天啊,我想我也必须变成这个专家。”的境地。我赞同这个想法,最好在项目早期就解决,并作为建设过程的一部分进行维护。这样,你可以避免开发出一个几乎无法卸载的产品的情况。(一段时间以来,Trac 就是一个这样的例子,它需要追踪具体版本的奇怪的 Python 库。)

我可以继续谈到Windows Installer有时决定使用我的慢速外部USB硬盘作为解压缩文件的地方,它似乎在那里无所作为,对于那些已经安装了大量MSI的计算机,进度条在单个安装期间重置自己数不清的次数是我见过的最愚蠢的事情,但我会把这些怒斥留到另一天。 =) 我可以继续谈到Windows Installer有时决定使用我的慢速外部USB硬盘作为解压缩文件的地方,它似乎在那里无所作为,对于那些已经安装了大量MSI的计算机,进度条在单个安装期间重置自己数不清的次数是我见过的最愚蠢的事情,但我会把这些怒斥留到另一天。 =)

我的两分意见;请注意,我真的只了解足以造成破坏的Windows Installer,但这是我来自小企业开发人员的评估,只是试图使用它。祝好运!

好的,如果您首先构建安装程序,将其作为构建系统的一部分,并随着您的项目逐渐扩展,这将更加容易。

我同意,Windows安装程序让我疯狂。但是有很多情况下,xcopy无法解决。有时候你希望安装多个用户,而不仅仅是当前用户。有时候你必须注册COM对象。有时候你必须对系统进行大量更改,如注册在启动时运行的服务、连接到网络服务器等。有时候用户无法使用命令提示符。而且当某些事情在中途失败时,你总希望能够全面回滚整个过程。

整个MSI数据库方法是最好的做法吗?我不确定。我是宁愿在我的头上钉钉子,也不想再写一行WiX代码了。但您必须承认,它做到了您可能需要的所有事情。当它无法做到时,总有CustomAction选项。

实际上,我想看到的是更好的文档(其实,什么是 50 类行动?能不能取个名字呢?)和更多易用的模板。

WiX 用户组别名很好地回答了问题。

你应该阅读RobMen的博客。他做得很好,解释了为什么事情是现在这个样子。他已经花了很多时间(比任何人都多)思考安装设置的问题。

你看过NSIS吗:http://en.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System

1:是的,2:不是

就个人而言,我大多数时候都同意@Conrad and @John Saunders。我在我的旧博客上很久以前写过这个主题。我认为@jeffamaphone对于Windows Installer的复杂性(以及我对设置的过分关注)有一定的观点,但我认为Windows Installer仍然是在Windows上安装的最佳选择。

一旦你完成了编码的所有难部分,如果你的辛勤工作没能成功安装,那就什么都没做。安装程序需要建立并在每个夜间构建中进行测试,几乎从一开始就要进行每个夜间的测试。你需要测试安装程序能否被建立和运行,并验证安装。

否则,如果你写代码时付出了多少辛勤努力都无所谓 - 如果无法安装,没有人会看到你的工作!

请注意,这也适用于XCOPY。

另外一件事:如果您的QA测试未测试安装程序安装的内容,那么它们在测试什么?您必须测试客户将获得的内容!

正如您所述,我们已经进行了内部版本发布,由开发团队通过复制所需文件进行处理,然后使用脚本和我们自己的工具完成其余设置。

然而,对于终端用户,您必须拥有某种形式的辅助向导,我已经在VS中使用了MS安装程序,发现它令人困惑和笨重。经过这次经历后,我通过让其他人执行安装步骤来避免了痛苦。有人能推荐一个好的.Net安装程序吗?

我使用Installshield,如果您不打算尝试太过花哨的东西(您为什么要这么做),那么它非常直观 - 设置初始设置,选择文件,设置快捷方式并创建setup.exe。

我会在我的代码中处理所有以后的更新 - 更加方便用户。





相关问题