Wix ExePackage并排安装,无需卸载

时间:2016-10-21 11:39:37

标签: wix upgrade uninstall side-by-side

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

理想情况下,安装一个时我想要发生的是:

  • 如果未安装Product3,则应该是。
  • 如果安装了Product3并且安装版本较高或相同,则不执行任何操作。
  • 如果安装了Product3并且安装版本较低,则升级。
  • 如果仍然安装卸载和product1或2,请不要卸载product3。

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

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

我看了一下这个类似的答案:

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

建议使用provideskeyrequires元素,但我无法找到任何有用的文档。我尝试过尝试但它似乎根本没有做任何事情。

我看过RelatedBundle,但我不确定这是我追求的。似乎更有针对性的修复系统。

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

1 个答案:

答案 0 :(得分: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时只会在卸载最后一个产品时删除。