2010-10-25 56 views
1

我們目前正在將我們的構建腳本從3.0升級到3.5,並在此過程中修復了一堆舊的ICE錯誤。我已閱讀了大量文章,但對於通常使用伴隨文件的最佳方法,我有點困惑。現在正確的方式來實現Wix伴侶文件?

,假設文件A.manifest是一個配套文件A.exe時...

原:我們的老建設2個組件打破了2個文件:

<Component Guid="*" Id="A.exe" SharedDllRefCount="yes"> 
    <File Id="..." KeyPath="yes" Source="A.exe"/> 
</Component> 
<Component Guid="*" Id="A.exe.manifest" SharedDllRefCount="yes"> 
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/> 
</Component> 

哪觸發器ICE54:警告組件'A.exe.manifest'使用文件'A.exe.manifest'作爲其KeyPath,但該文件的版本由文件'A.exe'提供,所以我想這顯然是錯誤的。

1日的做法:所以我嘗試添加的keyPath = YES到同伴的目錄:

<Component .../> 
<Component Guid="*" Id="A.exe.manifest" SharedDllRefCount="yes" KeyPath="yes"> 
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/> 
</Component> 

這抑制了警告,但在奧卡組件的的keyPath欄顯示爲空白,所以我懷疑它是正確的?

第二個辦法:接下來我想結合的組件:

<Component Guid="*" Id="A.exe" SharedDllRefCount="yes"> <!-- GUID is wrong! --> 
    <File Id="..." KeyPath="yes" Source="A.exe"/> 
    <File CompanionFile="A.exe" Id="..." Source="A.exe.manifest"/> 
</Component> 

但似乎讓維克斯自動生成這裏的GUID是行不通的。但是如果我手動生成GUID,那麼每次構建時都會在升級時破壞組件規則!我們實際上部署了很多的伴隨文件,因此生成每個組件的哈希並永久存儲它也可能是不可行的。同樣爲每個伴隨文件使用虛擬註冊表項。

TLDR:WiX中哪兩種方法實際上是更好的做法?

回答

1

我的問題是你想要解決什麼問題?一般情況下,除非您對組件規則以及使用/不使用伴隨文件的服務含義有深入的瞭解,否則您應該堅持1:1組件:文件比率,其中所有文件都是關鍵文件。這不是一個絕對的規則,但它可能是95-99%的最佳。

也就是說,查看File元素上的KeyPath屬性,並記住,當組件在MSI的KeyPath列中沒有數據時,這意味着組件目錄是關鍵路徑。

+0

嗯,我推測一般這是一個好主意,將unversioned/unversionable文件設置爲DLL或EXE的伴隨文件,以便在升級/卸載期間正確添加或刪除伴隨文件 - 是真正?我也明白,Windows Installer能夠使用修改時間和MsiFileHash處理未版本化的文件,但我們以前從未嘗試過。該功能足夠可靠嗎? – 2010-10-26 04:05:24

+0

是的,它很可靠。這取決於你想要發生在那個文件上。作爲伴隨文件,當密鑰文件得到更新時,所有文件都會被更新。由於它是自己的密鑰文件,因此修改時間推動了決策。如果用戶/進程在安裝後調整了文件會怎麼樣?你是否希望在下次升級過程中進行一些調整,或者是否希望將它們放在一邊,並且不再複製文件? – 2010-10-26 11:27:01

+0

啊,幾乎所有這些文件除了少數幾個實際上安裝到程序文件和公共文件,所以他們永遠不會被用戶修改。有了這個,我想最好是讓他們成爲你自己的密鑰文件,正如你所建議的那樣。 2.但是從「文件版本管理規則」來看,如果未版本控制的文件之後被修改,它永遠不會被覆蓋,所以假設它是它自己的密鑰文件,我該如何強制它呢? – 2010-10-27 04:32:03