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

Installation 如何在Windows软件包之间创建依赖关系,installation,wix,Installation,Wix,我们正在使用WiX为我们的产品创建两个包。包A包括模块和其他组件,它们是包B的先决条件。我希望在安装包B时阻止卸载包A 你能推荐一些技巧吗 (我尝试使用UpgradeVersion/OnlyDetect和启动条件设置属性,但在卸载过程中跳过发现的FindRelatedProducts。) @Cosmin有一个很好的方法。我所做的是在包含包a的升级代码的包B中添加一个注册表值(认为这将允许在将来需要时打破依赖关系) 然后在卸载过程中,包A检查“依赖项”。 not REMOVE=“AL

我们正在使用WiX为我们的产品创建两个包。包A包括模块和其他组件,它们是包B的先决条件。我希望在安装包B时阻止卸载包A

你能推荐一些技巧吗

(我尝试使用UpgradeVersion/OnlyDetect和启动条件设置属性,但在卸载过程中跳过发现的FindRelatedProducts。)


@Cosmin有一个很好的方法。我所做的是在包含包a的升级代码的包B中添加一个注册表值(认为这将允许在将来需要时打破依赖关系)


然后在卸载过程中,包A检查“依赖项”。


not REMOVE=“ALL”或not PACKAGE_B_取决于=“$(var.packageupgradecode)”

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

  • 每个包在注册表中写入一些信息,例如安装路径和产品版本
  • 每个软件包都使用一个用于检测其他安装程序的
  • 您可以使用“搜索”属性来设置条件
如果您不喜欢使用注册表,也可以使用文件搜索来查找已安装的文件

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


此外,在安装过程中通常会跳过启动条件。这就是为什么错误自定义操作是一个好方法。

什么会使启动条件被跳过?启动条件操作的默认条件。大多数安装程序编写工具将其设置为“未安装”,因此仅在安装期间评估启动条件。
  <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>
<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>