如何在Windows包之间创建依赖关系

时间:2011-10-29 03:39:37

标签: installer wix

我们正在使用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>

1 个答案:

答案 0 :(得分:3)

解决方案是使用注册表项和搜索:

  • 每个包在注册表中写入一些信息,例如安装路径和产品版本
  • 每个包使用registry search来检测其他安装程序
  • 您使用搜索属性来限制error custom action

如果您不喜欢使用注册表,您还可以使用文件搜索来安装文件。

请注意,FindRelatedProducts会检测同一产品的较旧版本或较新版本。 Windows Installer不支持链接两个软件包。

此外,安装期间通常会跳过启动条件。这就是错误自定义操作是一种好方法的原因。