WiX 工具集:如何 运行 捆绑包中的安装程序基于同一捆绑包中较早安装程序中所做的选择?

WiX toolset: How run an installer in a bundle based on choices made in an earlier installer in the same bundle?

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

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

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

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

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

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

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

那么这个问题有什么样的解决方法?

还在用MSI NativeUI是你问题的核心。 WiX 开发团队不推荐这样做。

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

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

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