2017-08-28 173 views
0

我對WiX相當陌生,因此我可能會問一些非常簡單的問題,但我找不到太多的幫助來搜索它。WiX:CustomAction基於另一個CustomAction的結果

我想執行2個customActions,也就是說,CA1和CA2,其中鈣的執行取決於CA1的結果,類似下面:

if (ca1 == SUCCESS) 
{ 
    Perform ca2 
} 

所以鈣應該只,如果我的CA1返回成功執行(不會失敗)。

在WiX中最簡單的方法是什麼?

回答

5

你描述的是默認值。如果自定義操作失敗,安裝將中止,並且以後只能執行回滾操作。因此,爲了讓您的問題合理化,首先您必須忽略或以其他方式掩蓋您的第一個自定義操作失敗。

其次,一個動作知道另一個動作的返回結果的唯一方法是它是否通過調用MsiDoAction(或其某個包裝器)來調用它。這樣做會模糊你的自定義操作之間的界限,所以我會假設這不是你描述的場景。

這會讓您用第三種也是最後的方式找到外部溝通渠道。對於直接行動,我建議ca1在成功後設置財產(請撥打MsiSetProperty或DTF會話[財產]的包裝),並且ca2讀取(MsiGetProperty/MsiEvaluateCondition)或直接針對該財產的價值進行調整。對於延遲操作,屬性不會傳播,因此您必須識別其他頻道。 (也許臨時文件的路徑被選擇提前選擇)

但是整個場景對於Windows Installer來說有點不尋常;我會建議避免它。也許合併你的行爲,以便任何故障情景可以在回到序列之前「內部」處理。或者你的行爲的具體細節可能會導致更具體的建議。

+0

感謝您的回答。事情是,我不想中止和回滾安裝,如果CA1失敗,只是CA2不執行CA1失敗。 ca1和ca2的動作都是直接的,所以我認爲使用第三種方式就是這種方式。那麼如何根據ca1結果設置屬性..任何示例代碼? – foobar

+0

具體而言,在ca1中,我想檢查是否啓用了Windows防火牆服務,並且在ca2中,我將在防火牆例外列表中將我的應用程序添加爲例外。 – foobar

+0

由一個CA編寫的HKLM密鑰是否可由第二個CA讀取?即使在延期模式?我從未使用過這樣的結構。似乎有點「部署臭」給我。無論如何,我認爲他應該嘗試使用WiX的防火牆功能? –

0

讓第一個自定義操作設置屬性。然後,如果該屬性存在或設置爲期望值,則只運行第二個自定義操作。

+0

謝謝,但你能展示一些關於如何使用防火牆的示例/參考代碼使用自定義操作設置屬性。 – foobar

2

您不得使用即時模式自定義操作對系統進行更改。當設置由具有提升權限的受限用戶執行時,它們永遠不會正常運行(即時模式操作永遠不會提升,它們總是模擬用戶,因此您嘗試更改的任何內容都將觸發訪問被拒絕)。此外,它們可能無法在靜默執行模式下運行,具體取決於您的排序(例如,如果您嘗試從設置GUI調用它們)。

Michael Urman談到的自定義操作之間的另一個「外部通信通道」可能是HKLM中的一個註冊表鍵,您可以編寫然後回讀。

但是,真正的解決方案是嘗試WiX的內置防火牆功能。它由知識豐富的MSI專家可靠編寫,並支持適當的回滾。這將大大優於別人怎麼能對自己的滾動: http://wixtoolset.org/documentation/manual/v3/xsd/firewall/firewallexception.html

+0

非常感謝您的輸入。已經有一個用C++編寫的防火牆DLL正在項目中使用,所以我無權更改它。但我希望你的回答會幫助別人。 – foobar

+1

好的,如上所述 - 請務必不要在即時模式下運行自定義操作 - 否則您將看到受限用戶使用提升權限進行安裝的企業部署問題。並且不要將自定義操作僅插入安裝GUI(InstallUISequence)中 - 當您的安裝程序安裝無提示時,完全跳過此順序。您應該使用插入到InstallExecuteSequence中的延遲自定義操作。如果你喜歡單獨的答案,我可以提供一些關於如何測試這個工作的細節。 –

1

從維克斯文檔here

<InstallExecuteSequence> 
     <Custom Action='FooAction1' After='InstallFiles'/> 
     <Custom Action='FooAction2' After='FooAction1' Condition='FOOACTION1SUCCESS'/> 
    </InstallExecuteSequence> 

讓您的代碼在FooAction1中設置屬性MsiSetProperty('FOOACTION1SUCCESS','1') 現在FooAction2只會在設置FOOACTION1SUCCESS屬性時運行。但是,邁克爾·烏爾曼的回答是正確的。您應該在一個自定義操作中處理異常。

相關問題