好的, 排序它,所以我最好發佈我的解決方案。
最終把它歸結爲兩個部分...
一)在每個產品微星的這是在安裝時設置的設置註冊表項。顯然,如果最初未安裝該MSI,則該註冊表項將不存在。即
<!-- registry entry to state that the item has been installed-->
<Component Id="cmp_WriteToRegistry" Guid="[yourguid]">
<RegistryKey Root="HKLM"
Key="Software\MyCompany]"
Action="createAndRemoveOnUninstall">
<RegistryValue Type="integer" Name="ProductA" Value="1" KeyPath="yes"/>
</RegistryKey>
</Component>
B)做升級時,檢查燒傷該註冊表項的存在......
<!-- Determine what items are to be installed in the event of an install using the BA-->
<WixVariable Id="chkProductA" Value="![CDATA[chkProductA]]" />
<WixVariable Id="chkProductB" Value="![CDATA[chkProductB]]" />
<WixVariable Id="chkProductC" Value="![CDATA[chkProductC]]" />
<!-- Determine what items are installed in the event of an upgrade-->
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductAInstalled" Variable="ProductAInstalled" Result="exists" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductBInstalled" Variable="ProductBInstalled" Result="exists" />
<util:RegistrySearch Root="HKLM" Key="SOFTWARE\MyCompany" Value="ProductCInstalled" Variable="ProductCInstalled" Result="exists" />
<Chain>
<MsiPackage SourceFile="..\SetupProductA\bin\Release\SetupProductA.msi"
InstallCondition="chkProductA OR ProductAInstalled" />
<MsiPackage SourceFile="..\SetupProductB\bin\Release\SetupProductB.msi"
InstallCondition="(chkProductB) OR (ProductBInstalled)" />
<MsiPackage SourceFile="..\SetupProductC\bin\Release\SetupProductC.msi"
InstallCondition="(chkProductC) OR (ProductCInstalled)" />
</Chain>
</Bundle>
所以在InstallCondition,當使用UI chkProductA計算結果爲真,相應的複選框會被檢查,並且 ProductAInstalled在相應的產品已經安裝時評估爲真 - 照顧在我的情況下沒有任何用戶交互發生的更新。
簡單,當你知道如何。我當然沒有下手......
舊禮儀再次回答你自己的問題......如果有人有更好的答案,我會很高興聽到它,好像上面是答案,它可能不是最好的。如果一個星期左右沒有更好的答案,我會將其設置爲答案。我不是釣魚點,所以猜測這是正確的事情... –
你的解決方案是我將如何做到這一點。它類似於「記住屬性模式」:http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern – BryanJ
謝謝布賴恩。我仍然在初學者/重新發明輪子階段,所以很高興知道。 –