2010-09-23 142 views
2

我正在爲要安裝的包編寫WXS文件。爲了簡單起見,假設我想安裝1個文件,然後我想對它執行一個命令(在我的情況下,它是一個公共GPG密鑰,我想在安裝完成後導入它)。這裏是我的WXS文件的相關部分:在WIX中執行自定義操作時未安裝文件

<CustomAction Id="ImportKey" Directory="INSTALLDIR" 
       ExeCommand="[SystemFolder]cmd.exe /C gpg --import keyfile.key" 
       Return="check" /> 

<!-- Install file keyfile.key into C:\GnuPG --> 
<Directory Id="TARGETDIR" Name="SourceDir"> 
    <Directory Id="INSTALLDIR" Name="GnuPG"> 
     <Component Id="GnuPGConfiguration" Guid="E9469F1C-A875-1014-A3B3-DEF3264B13C4"> 
      <File Name="keyfile.key" Id="KeyfileKey" /> 
     </Component> 
    </Directory> 
</Directory> 

<Feature Id="GnuPGConfiguration" Level="1" Title="GnuPG Configuration"> 
    <ComponentRef Id="GnuPGConfiguration" /> 
</Feature> 

<!-- Run custom action after files are installed --> 
<InstallExecuteSequence> 
    <Custom Action="ImportKey" After="InstallFiles">NOT Installed AND NOT PATCH</Custom> 
</InstallExecuteSequence> 

我可以成功構建MSI。安裝時,我使用msiexec並打開日誌記錄。在那裏,它表示自定義操作的安裝失敗,並且在日誌中找到了正確的命令。手動運行它的作品。如果我註釋掉該命令的執行,則該文件將安裝在正確的位置(安裝後存在C:\ GnuPG \ keyfile.key)。

而不是運行我的GPG命令,我試圖運行dir ant將其輸出重定向到一個文件。查看它,我可以看到keyfile.key不在C:\ GnuPG中的文件中。看起來該命令在文件安裝之前運行。

關於我在做什麼的錯誤?

回答

5

你需要閱讀和理解:

Installation Phases and In-Script Execution Options for Custom Actions in Windows Installer

你會發現自己需要考慮

<CustomAction ... Execute="deferred" and Impersonate="no" ... /> 

而且你很可能需要限定.key文件的位置,因爲你當前目錄不會是你想象的那樣。

+0

這解釋了一切。謝謝。 – Sevas 2010-09-27 13:40:19

+0

如果你有時間,鏈接很好閱讀。否則,不準確但足夠好的TL; DR是「Windows安裝程序在所有階段中運行兩次,第一次構建要安裝的內容和要運行的腳本;第二階段它實際執行操作(例如安裝文件) 。未延遲的操作在第一階段運行,不能依賴於任何已安裝的文件。「 – Pace 2017-06-27 21:10:17

+0

讓我把它添加到你的列表::) http://blog.iswix.com/2010/09/read-windows-installer-sdk.html – 2017-06-28 18:09:13

相關問題