2012-10-16 74 views
9

我有燒傷的安裝,從而用戶可以選擇其中三個選項安裝 - 每一個直接涉及在鏈的三家MsiPackages,如一個:維克斯刻錄 - 確定哪些項目已安裝

<Chain> 
    <MsiPackage SourceFile="..\ProductA\bin\Release\ProductA.msi" InstallCondition="chkProductA" /> 
    <MsiPackage SourceFile="..\ProductB\bin\Release\ProductB.msi" InstallCondition="chkProductA" /> 
    <MsiPackage SourceFile="..\ProductC\bin\Release\ProductC.msi" InstallCondition="chkProductC" /> 
</Chain> 

一切都好。但是,當我下次運行msi時,我只想重新安裝/更新最初選擇的項目 - 即,如果僅選擇了productA,則我不想安裝產品B & C.

我確定最初選擇的是什麼?

回答

11

好的, 排序它,所以我最好發佈我的解決方案。

最終把它歸結爲兩個部分...

一)在每個產品微星的這是在安裝時設置的設置註冊表項。顯然,如果最初未安裝該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在相應的產品已經安裝時評估爲真 - 照顧在我的情況下沒有任何用戶交互發生的更新。

簡單,當你知道如何。我當然沒有下手......

+0

舊禮儀再次回答你自己的問題......如果有人有更好的答案,我會很高興聽到它,好像上面是答案,它可能不是最好的。如果一個星期左右沒有更好的答案,我會將其設置爲答案。我不是釣魚點,所以猜測這是正確的事情... –

+0

你的解決方案是我將如何做到這一點。它類似於「記住屬性模式」:http://robmensching.com/blog/posts/2010/5/2/The-WiX-toolsets-Remember-Property-pattern – BryanJ

+0

謝謝布賴恩。我仍然在初學者/重新發明輪子階段,所以很高興知道。 –

4

如果你正在做你自己的管理引導器應用,你可以在一個DetectPackageComplete事件處理程序做到這一點:

CustomBA_DetectPackageComplete(object sender, DetectPackageCompleteEventArgs e) 
{ 
    if (e.PackageId == "SetupProductA" && e.State == PackageState.Present) 
    { 
     CustomBA.Engine.NumericVariables["chkProductA"] = 1; 
    } 
    etc... 
} 

類似的事情可以做檢測使用DetectMsiFeature安裝功能。

這就是說,我只會使用這種方法,如果你已經有一個自定義BA。建立自定義BA是lot的工作。

+0

您是否建議在自定義託管boostraper應用程序中執行註冊表搜索? –

+0

@phoenix,你不需要做一個註冊表搜索,假設你在你的包中包含msi的更新版本。刻錄引擎會根據捆綁中相關的msi升級代碼檢測現有的msi,並觸發「DetectPackageComplete」事件。約翰賴特寫了[一個很好的例子](http://www.wrightfully.com/part-4-of-writing-your-own-net-based-installer-with-wix-handling-current-and-future -state /)處理這個。 –