【问题标题】:Wix ExePackage Side by Side Install without UninstallWix ExePackage 并排安装,无需卸载
【发布时间】:2017-03-03 17:05:53
【问题描述】:

我有两个产品正在尝试为其编写安装程序。两种产品都是 wix 捆绑包,它们都需要第三个产品捆绑包。

理想情况下,当您安装一个时,我希望发生的是:

  • 如果 Product3 未安装,则应该安装。
  • 如果安装了 Product3 并且安装的版本更高或相同,则什么也不做。
  • 如果安装了 Product3 并且安装的版本较低,则升级。
  • 如果卸载并且产品 1 或 2 仍然安装,请不要卸载产品 3。

到目前为止,我能够征服其中的一些点,但不是同时完成的。

最初我尝试使用 ProductSearch 和 InstallCommand 获取已安装的版本。但是,我在并行安装时遇到了卸载问题,因为 installcommand 更像是“请求的安装状态”,所以如果我不想在它检测到相同版本时安装它,它实际上会开始卸载它。

我看了这个类似的答案:

How to avoid uninstalling previously installed ExePackage (redistributables) while installing a WiX Bundle?

它建议使用 provideskeyrequires 元素,但我找不到任何有用的文档。我试过用它做实验,但它似乎什么也没做。

我看过RelatedBundle,但我不确定这是我想要的。似乎更针对修复系统。

我希望有一种方法可以做到这一点,而不必诉诸自定义操作,因为这对于看似相当简单的功能来说似乎有点极端。

【问题讨论】:

    标签: wix upgrade uninstallation side-by-side


    【解决方案1】:

    经过大量试验和错误后,我想出了如何让 DependencyExtension 工作。

    在下面的示例中,ProductC 是一个 Wix Bundle 可执行文件。此捆绑包包含一个 MSI 文件。我使用 productSearch 来查找该 MSI 文件(不是捆绑包)的升级代码,以检测它是否已安装。

    在项目 A 和 B 的捆绑文件中:

    <Wix xmlns:dep="http://schemas.microsoft.com/wix/DependencyExtension"
         xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
        <Bundle>
            <util:ProductSearch Id="ProductCInstallSearch"
                                UpgradeCode="{ProductC_MSI_UpgradeCode_GUID}"
                                Variable="ProductCInstalled"
                                Result="state"/>
            <dep:Requires Id="ProductCRequired" ProviderKey="ProductC"/>
            <Chain>
                <PackageGroupRef Id="ProductC_pkg"/>
            </Chain>
        </Bundle>
        <Fragment Id="Required_Pkgs">
            <PackageGroup Id="ProductC_Pkg">
                <ExePackage Id="ProductC_Bundle"
                            Permanent="no"
                            DetectCondition="NOT ProductCInstalled = 2"
                            InstallCommand="/quiet"
                            UninstallCommand="/uninstall /quiet">
                    <dep:Provides Key="ProductC"
                                  Version="0.0.0.0">
                        <dep:RequiresRef Id="ProductCRequired"/>
                    </dep:Provides>
                </ExePackage>
            </PackageGroup>
        </Fragment>
    </Wix>
    

    现在您可以按任何排列方式安装 A 和 B,并且在卸载产品 C 时,只有在最后一个卸载后才会删除。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-31
      • 2019-03-02
      • 2013-07-21
      • 1970-01-01
      • 2014-06-03
      • 2019-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多