2010-08-13 135 views
9

在Windows安裝XML工具集中,要安裝服務,我們將<ServiceInstall><File>組合爲<Component>。要有條件地安裝該服務,我們將<Condition>置於<Component>之下。但是,如果條件爲false,則該文件也不會被安裝。如果我將<File>置於無條件<Component>中,則該服務沒有可執行文件路徑,因此安裝將失敗。如果我將<File>都放在<Component>中,則會找到重複的符號。WiX:有條件安裝服務,但無條件安裝文件

問題是,我們可以有條件地安裝服務,但無條件安裝相關的可執行文件嗎?

謝謝!

+1

如果ServiceInstall/@ Start屬性可以設置爲[Property],那將會非常好,因此您仍然可以在不啓動服務的情況下安裝服務。 – Ivan 2017-01-18 10:29:32

回答

5

使用不同的GUID和Ids'以及互斥條件創建兩個組件:一個用於文件和服務,另一個用於文件。類似這樣的:

<Component Id="SvcComp" Guid="{YOUR-GUID}" SharedDllRefCount="yes"> 
    <Condition> SOME_CONDITION </Condition> 
    <File Id="SvcFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
    <ServiceInstall Id="Svc" Name="Service" DisplayName="Service" Description="Service" Type="ownProcess" Start="auto" ErrorControl="normal" Vital="yes" /> 
    <ServiceControl Id="Svc" Name="Service" Stop="both" Remove="uninstall" Wait="yes" /> 
</Component> 

<Component Id="ExeComp" Guid="{YYOUR-GUID}" SharedDllRefCount="yes" > 
    <Condition> NOT SOME_CONDITION </Condition> 
    <File Id="ExeFile" Name="Service.exe" Source="Service.exe" Vital="yes" /> 
</Component> 

您將得到一個LGHT1076警告,因爲組件中的條件是互斥的,所以可能會被禁止。

+0

感謝您的建議,我發現我錯過的是文件ID。使用不同的Id但名稱相同,相同的文件可以存在於不同的''中。 – 2010-08-13 13:09:54

+1

技術上可行,但你會得到ICE驗證錯誤,因爲這兩個組件具有相同的鍵路徑。這不是一個乾淨的解決方案。 – 2013-02-12 17:23:46

1

我一直在走這條路,它會變得複雜得更快,然後會有人期待。

我認爲有兩個組件(儘管它們是互斥的條件表達式)具有相同的密鑰文件,但不同的ServiceInstall/Control資源違反了組件規則。

我建議這樣做的方法是將所有的業務邏輯轉移到一個獨立的DLL組件中,並創建兩個不同的EXE組件。將其中一個設置爲控制檯/ Windows應用程序,另一個設置爲服務應用程序。將組件關聯到兩個不同的功能,以便最終用戶可以決定他想要配置應用程序的方式。然後用戶可以在添加/刪除程序中進行修改操作,並在稍後使用MSI改變主意。

2

如果您只有一項服務,則可以排除InstallExecuteSequence表中的服務操作。

或者,您必須在立即階段運行CA,在延期執行期間暫時從服務表中刪除條目。

我不是無緣無故分裂dll的粉絲。

+0

正確的應用程序設計將代碼分解爲多個程序集中的多個類。創建一個包含服務器組件的程序集,並創建兩個程序集以充當控制檯主機和服務主機。您提出的建議只會導致不符合最佳做法的黑客MSI。 – 2013-02-12 17:21:59