基于 WiX 的 windows 安装程序可以在其他安装程序中使用吗?

Can a WiX based windows installer be used within other installers?

使用 WiX 引导程序构建的设置是否通常能够 运行在其他安装程序中运行?

我想创建一组可分发的文件,其中包含 api dll、安装 API 使用的服务的安装程序和任何先决条件文件 (VC+ +、.NET 框架等)。此设置将由 Wix 引导程序构建到 .exe 文件中。然后,最终客户可以将我们的 .exe 安装程序放入他们的安装程序中,然后 运行 它会静默安装 运行 我们的 API.

所需的一切

简短的回答: 你的 setup.exe 可以被另一个 setup.exe 安装,只要它可以不会同时安装多个 MSI 文件,其他 setup.exe 也会按顺序 运行 进行安装,而不会同时安装多个 MSI。下面是技术解释。

基本上,您可以将设置作为 setup.exeMSIa merge module 或以上所有形式提供。

更新:我想看看您是否熟悉 WiX 包含文件?


InstallExecuteSequence Mutex: 两个 MSI 文件不能 运行 它们的实际安装操作(实际更改系统的操作) 同时出于非常基本的技术原因(当 InstallExecuteSequenceInstallFinalize 之间的 InstallExecuteSequence 运行 时设置 mutex

Multiple MSI GUIs:这个问题我已经写过很多次了,但我认为最直接的解释是this one from serverfault.本质上,系统被锁定以确保如果在安装过程中发生错误,所有更改都可以回滚。应该注意的是,您可以一次启动多个 MSI 文件并进入它们的 GUI 序列(换句话说,显示为实际安装做准备的设置对话框),但是您一次只能启动一个进行实际的系统更改 - 在技术上运行宁 InstallExecuteSequence.

的术语

已排序的 MSI 文件:MSI 文件可以 运行 "one after the other" 没有问题,前提是它们都很好设计的。 WiX 引导程序 Burn 是专门为此目的而制作的(以及其他一些免费用途:下载器、引导程序、音序器、允许外部、自定义设置 GUI 等)。


可能的方法:您的设置似乎将作为其他软件套件安装的一部分包含在内?这里有几个选项。

  • 运行 in Sequence:如果其他软件供应商对此表示满意,他们可以将您的 setup.exe 包含在他们的 setup.exe 中并让它 运行 完成,然后再继续他们自己的设置。这意味着他们使用 WiX (Burn) 创建的 setup.exe 或使用 Advanced Installer、Installshield 或其他商业工具(甚至只是 dotnetInstaller - 这是一个免费的引导程序)生成的等效 setup.exe 来执行此操作).

  • Merge Module (a Symantec article): 或者你可以用你自己的设置制作一个 "merge module" - 这是一个消耗品,二进制 "bundle" 可以在编译/构建时合并到任何 MSI 设置中。它是一个小数据库片段,或者如果您愿意,可以是部分数据库。它将包含设置为以适当方式安装的所有组件。本质上,合并模块是您的设置,作为一个可消耗的、完整的组件交付,成为其他设置的实际部分——无需作为单独的先决条件安装。换句话说,它是提供 运行 时间的另一种方式,无需提供单独的设置。这是 MSI 最初打算部署先决条件的方式,现在基本上仍然如此 - 尽管现在存在 Burn 等替代方案。

  • MSI 文件:坦率地说,我最喜欢的方法是不用担心 setup.exe 启动器会做很多预- 必需的安装,但要交付符合标准的 MSI 文件,您的客户可以在自己安装之前按顺序 运行。如果未安装适当的 运行 次,您的 MSI 可以设置启动条件以拒绝安装。这样,如果发现错误,您的 MSI 可以 "update itself",并且理论上它可以单独分发 - 无需重新编译捆绑合并模块的所有设置 - 任何安装了软件第一个版本的计算机。我喜欢这种解耦。

真实世界的故事:很多人喜欢合并模块。我不得不承认我不是超级粉丝,但如果做得好,它们会工作得很好。有时我被迫处理合并模块,这些合并模块以其令人难以置信的内置设计缺陷破坏了完美的设置(我想到了当天回来的 SOAP 合并模块 - 它彻底 - 并且单枪匹马 - 引发了我的设置错误率,必须删除)。不是合并模块本身作为一项技术的问题,而是不止一次导致问题的实际问题。

这个故事的寓意:不要提供一个糟糕的合并模块,其中包含许多失败的自定义操作和怪异的要求,这些要求会因不必要的脆弱性和内容而使 "parent setup" 膨胀。如果您交付一个符合标准的合并模块来完成其任务 "minimally" - 那么这是部署您的 运行 时间的好方法,甚至是一些供应商的首选。

Core OS 运行times:我建议不要将 .NET 框架与您的设置 - 特别是如果它是供公司使用。 Dot NET 现在几乎可以通过 OS 本身始终可用,并且设置中包含的 运行 时间很快就会变得过时膨胀,并且 "fat" 公司应用程序包装商将花费大量资金时间摆脱你的包裹。 Dot NET 更新最好通过 Windows 更新(或等效的企业部署机制)分发。

相反,拥有 one-page (PDF) document explaining (see a bit down the page) 您的应用程序正常运行所需的先决条件似乎是一种正常的方法。当然,对于合并模块组件,您会记录这一点,因为您不能将核心 运行times 包含在您自己的合并模块中 - 通常您只能安装自己的文件。


部分链接(仅供参考):