我有两个产品,我正在尝试编写安装程序。这两种产品都是wix捆绑包,它们都有第三个产品包作为要求。
理想情况下,安装一个时我想要发生的是:
到目前为止,我能够同时征服其中的一些但不是全部。
最初我尝试使用ProductSearch并使用InstallCommand
来获取已安装的版本。但是我在进行并排安装时遇到了卸载问题,因为installcommand更像是“请求的安装状态”,因此如果我不想在安装时检测到相同的版本而安装,它实际上就会开始卸载它。
我看了一下这个类似的答案:
建议使用provideskey
和requires
元素,但我无法找到任何有用的文档。我尝试过尝试但它似乎根本没有做任何事情。
我看过RelatedBundle
,但我不确定这是我追求的。似乎更有针对性的修复系统。
我希望有一种方法可以做到这一点,而不必采用自定义操作,因为对于看起来相当简单的功能而言,这似乎有点极端。
答案 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时只会在卸载最后一个产品时删除。