2011-10-29 53 views
3

我們使用WiX爲我們的產品創建兩個包。軟件包A包含作爲軟件包B的先決條件的模塊和其他組件。我想在安裝軟件包B時阻止軟件包A卸載。如何創建Windows包之間的依賴關係

你能推薦一些技巧嗎?

(我試過了啓動條件以及設置與UpgradeVersion/OnlyDetect的屬性,但發現FindRelatedProducts卸載過程中跳過)。


@Cosmin有一個不錯的辦法。我所做的是將註冊表值添加到包含程序包A的UpgradeCode的程序包B(認爲這將允許在將來需要時打破依賴關係)。

<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> 

回答

3

的溶液是使用註冊表項和搜索:

  • 每個包寫在註冊表中的某些信息,例如安裝路徑和產品版本
  • 每個包使用registry search其檢測其他安裝
  • 您使用搜索屬性條件的error custom action

如果您不喜歡使用註冊表,則還可以使用文件搜索安裝的文件。

請注意,FindRelatedProducts檢測到同一產品的舊版本或更新版本。 Windows Installer不支持鏈接兩個軟件包。

此外,安裝期間通常會跳過啓動條件。這就是爲什麼錯誤自定義操作是一個好方法。

+0

什麼會使啓動條件跳過? – Demyn

+1

LaunchConditions操作的默認條件。大多數安裝創作工具將其設置爲「未安裝」,因此僅在安裝期間評估啓動條件。 –