2011-10-07 50 views
1

在選擇功能時,在Wix中很容易啓用組件。我想做相反的事,除非選擇了一個給定的特徵,否則組件將被安裝。原因是,如果選擇了給定的功能,組件將執行不需要的配置更改。如何在選擇功能時禁用Wix組件?

失敗的實驗:

我使用的組件條件的嘗試:

<Component ...> 
    <Condition>&Feature = 3</Condition> 
    ... 
</Component> 

那是不行的,因爲apparently the feature states are not calculated at the point where the component conditions are evaluated

我也嘗試使用自定義操作集在CostFinalize之前運行,以便設置可以在組件條件中測試的屬性。這也沒有工作:

<Custom Action="Transfer_Feature_State" Before="CostFinalize" /> 
<Custom Action="Transfer_Feature_State_Property" Before="MtpWeb_Features_LabManager" /> 
<Custom Action="Transfer_Feature_State_Feature" Before="MtpWeb_Features_LabManager" /> 

當自定義操作運行,該功能狀態仍設置爲-1,所以功能狀態尚未CostFinalize之前計算。

有沒有什麼方法可以根據特徵選擇禁用組件?

+0

我考慮過只是將我的配置更改移動到稍後可以調度的自定義操作,而不是使用'Util:XmlFile',而是寧願將所有內容都保存在Wix腳本中。 –

回答

3

組件被組織成功能。這意味着默認情況下,功能中的所有組件都已安裝。如果您不希望某個功能安裝組件,則可以確保該組件未包含在該功能中。

你真正想要的是互斥功能。基本上,只有在未安裝其他功能時才能安裝包含該組件的功能,反之亦然。

這不受Windows Installer支持,因此只能使用自定義操作才能完成此操作。基本上,當選擇給定功能時,可以使用MsiSetFeatureState函數來確保未安裝包含組件的其他功能。

+0

謝謝,我會在什麼階段安排這個自定義操作來查看第一個狀態?我可以用非用戶可見的功能來做到這一點嗎? –

+1

你可以使用任何功能。自定義操作可以在CostFinalize和InstallInitialize之間的任意位置進行調度。 –

相關問題