首页 > 解决方案 > WiX 工具集:如何根据在同一捆绑包中早期安装程序中所做的选择运行捆绑包中的安装程序?

问题描述

如果用户选择安装需要这些第 3 方依赖项的软件组件,我试图实现的是一种仅在捆绑包中安装特定第 3 方依赖项的方法。

我们更具体的用例:在捆绑包中,我们首先为我们自己的软件运行自定义安装程序,用户可以在其中选择他们需要的功能。用户可能会选择安装一个使用激光扫描仪来检测事物的软件。如果用户确实选择了该选项,则应稍后在捆绑包中安装第 3 方激光扫描仪配置器软件。

到目前为止,我尝试的是在util:FileSearch元素中添加以下Bundle元素:

<util:FileSearch Id="CheckOurSoftwareExists"
                 Path="[WindowsVolume]\Company\Software\OurSoftware\OurSoftware.exe"
                 Variable="OURSOFTWAREEXISTS"
                 Result="exists" />

并在ExePackage元素内部的Chain元素中使用它:

<ExePackage Id="LaserScannerConfiguratorInstaller"
            SourceFile="3rd-party-installers\path\to\laser-scanner-configurator-installer.exe"
            InstallCondition="OURSOFTWAREEXISTS" />

这不起作用,因为util:FileSearch据说在任何捆绑安装程序启动之前已经执行。即使InstallCondition在第 3 方安装程序启动之前对属性进行评估,该变量OURSOFTWAREEXISTS也已经在之前被赋予了一个值。

那么对于这个问题有哪些解决方法呢?

标签: installationwix

解决方案


仍然使用 MSI Native UI 是您问题的核心。WiX 开发团队不建议这样做。

如果您禁用您的本机 MSI UI 并让用户在引导程序 UI 中做出选择,您可以使用它作为安装或不安装 EXE 包的条件,并将属性传递给您的 MSI 以控制安装哪些功能。

否则,我怀疑您必须编写一个自定义引导程序应用程序,该应用程序在安装 MSI 后重新评估属性并重新计算要安装的软件包的成本。

我想一个快速丑陋的黑客将是为读取机器的 EXE 编写一个自定义的 EXE 包装器,以查看是否安装了该功能,并选择调用真正的 EXE 或退出而不安装它。


推荐阅读