我们正在使用WiX为我们的产品创建两个包。软件包A包括作为软件包B先决条件的模块和其他组件。我希望在安装软件包B时防止软件包A卸载。
你能推荐一些技巧吗?
(我尝试使用UpgradeVersion / OnlyDetect设置属性以及启动条件,但在卸载期间会跳过发现的FindRelatedProducts。)
@Cosmin有一个很好的方法。我所做的是向Package B中添加一个包含Package A的UpgradeCode的注册表值(如果需要,这将允许将来破坏依赖关系。)
<Component Id="RegistryInfo" Guid="*" Win64="$(var.Win64YesNo)">
<RegistryKey Id="CurrentVersion" Root="HKLM" Key="SOFTWARE\MYCO\PACKAGE_B\CurrentVersion" Action="create">
<RegistryValue Name="ProductVersion" Value="[ProductVersion]" Type="string" />
<RegistryValue Name="PackageAUpgradeCode" Value="$(var.PackageAUpgradeCode)" Type="string" />
</RegistryKey>
</Component>
<Component Id="RegistryInfo" Guid="*" Win64="$(var.Win64YesNo)">
<RegistryKey Id="CurrentVersion" Root="HKLM" Key="SOFTWARE\MYCO\PACKAGE_B\CurrentVersion" Action="create">
<RegistryValue Name="ProductVersion" Value="[ProductVersion]" Type="string" />
<RegistryValue Name="PackageAUpgradeCode" Value="$(var.PackageAUpgradeCode)" Type="string" />
</RegistryKey>
</Component>
然后,程序包A在卸载期间检查“依赖性”。
<Property Id="PACKAGE_B_DEPENDS_ON">
<RegistrySearch Id="PackageAUpgradeCode" Root="HKLM" Key="SOFTWARE\MYCO\PACKAGE_B\CurrentVersion" Name="PackageAUpgradeCode" Type="raw" />
</Property>
<Condition Message='Package A is installed and requires this package.'>
not REMOVE = "ALL" or not PACKAGE_B_DEPENDS_ON = "$(var.PackageAUpgradeCode)"
</Condition>
答案 0 :(得分:3)
解决方案是使用注册表项和搜索:
如果您不喜欢使用注册表,您还可以使用文件搜索来安装文件。
请注意,FindRelatedProducts会检测同一产品的较旧版本或较新版本。 Windows Installer不支持链接两个软件包。
此外,安装期间通常会跳过启动条件。这就是错误自定义操作是一种好方法的原因。