2009-09-10 23 views
19

什麼時候應該更改或不更改WIX中的組件GUID?The Microsoft SDK information is confusing在wix中更改我的組件GUID?

Glytzhkof編輯:爲了澄清,該問題涉及何時應更改組件GUID組件的GUID。組件可以改變方面,如:更改的目標路徑,添加或刪除文件到/從相同的組件,添加註冊表數據等...這會導致所謂的組件引用問題,即MSI中的best practice for creating components

+1

你能否在你的問題中增加更多細節?我不確定你在問什麼。 – 2009-09-10 12:53:25

回答

37

MSI的整體概念是,有一個1:一個組件GUID(唯一標識符)和一個絕對路徑(安裝位置/關鍵路徑)之間1映射。完整路徑,包括文件名(如果有的話)。請參閱下面的更新以獲取新的Wix功能,以便自動處理這個問題。

我使用一些簡單的規則應對過於複雜和無意義的組​​件規則:

  • 始終使用每個文件的一個單獨的組件(即使對於非二進制文件)。這避免了各種問題。有幾個例外:
    • 多文件.NET程序集都應該在一個組件,因爲他們應該始終安裝/卸載作爲一個單元。
    • 其他一些,一般文件類型進來「匹配對」 - 它們屬於一起。通常這些是內容和索引文件。例如,考慮Microsoft幫助文件:
      • .HLP和.CNT文件屬於一起。
      • .CHM和.CHI文件屬於一起。
    • 有可能有幾個這樣的文件類型屬於一起,因此應該放在同一個組件,所以他們一起安裝/卸載 - 我懷疑某些證書文件是候選人。很難拿出一個明確的名單。只要問問自己「這些文件總是屬於一起」 - 所以只要有新版本,它們總是成對出現?如果是,則通過相同的組件安裝它們。將版本化的文件(如果有)設置爲密鑰文件。
  • 請記住,一旦爲組件分配了一個GUID,它就會被設置爲該組件的關鍵路徑(絕對路徑)。如果您將文件移動到新位置或重命名文件,請爲其指定一個新的組件GUID(因爲絕對路徑不同,它實際上是一個新的標識)。
  • 總之,組件GUID綁定到絕對安裝位置,而不是特定文件。 如果它移動了,GUID不會跟隨該文件。 GUID引用計算絕對位置,而不是文件本身。
  • 不要添加或刪除現有組件中的文件。導致各種升級和修補問題。這就是爲什麼我一般喜歡每個組件一個文件的原因。
  • 組件引用還有很多,但我將其留作「概述」。

一些樣本:

  • 您重命名文件C:\ Program Files文件\ MyCompany的\ MyApp的\ MyFile.exeC:\ Program Files文件\ MyCompany的\ MyApp的\ MyFile_NEW.exe 。這對組件創建意味着什麼?這是一個新的絕對安裝路徑,因此您爲託管組件生成一個新的GUID,或者添加一個新組件並刪除舊組件(具有相同的效果)。
  • 您更新的MSI提供了新版本的MyFile.exe。位置與以前相同,這意味着組件GUID不應更改。這是相同的文件(身份),只是在不同的版本。

UPDATE:WIX現在有一個新的auto-generate component GUID功能,calculates a GUID只要目標路徑保持不變。我沒有嘗試過這個說實話,但很多似乎沒有問題,並Rob Mensching (Wix author) states it is safe for normal use。作爲一個概念,我強烈推薦這個,因爲它具有一些自動魔法,並且保護你不受某些複雜因素的影響。

另請注意,you can leave out a lot of source attributes from your Wix xml file並依賴於Wix默認值而不是硬編碼值。

+1

有史以來最偉大的迴應。你搖滾! – Rohit 2009-09-18 14:36:24

+3

關於「絕對路徑」的部分並不完全正確。您可以將相同的組件(相同的GUID)安裝到不同的目錄,並且引用計數可以正常工作。目錄簡化了上述說明。 – 2009-09-26 06:57:04

+1

在文件成本計算並解析目錄表及其目錄屬性並且用戶具有(可能)選擇安裝目錄之後,組件GUID將指向絕對關鍵路徑? 我認爲最簡單的方法是關注你的源文件夾 - 如果你移動你的源文件夾中的文件,你改變了GUID。據我所知,實際的安裝位置是一個「移動目標」,直到解決目錄爲止,但你總是以絕對路徑作爲每個安裝組件的關鍵路徑? – 2009-09-26 18:28:23

0

查看WiX Tutorial, The Files Inside,瞭解組件規則的詳細說明。基本上,它說你永遠不會改變組件的GUID,因爲這意味着孤立舊組件並創建一個新組件。

+0

該鏈接很有用,但答案對決定要閱讀的內容並不是很有幫助(並非所有人都有很多時間)。我建議至少從文章中添加一個引用,像*'[...],一個組件應該只包含強大的屬性,以便始終需要一起安裝或刪除它們。如果這意味着一個文件,那麼你的組件將包含一個單獨的文件。這不僅是正常的,而且正是你所期望的。不要害怕,如果需要,Windows安裝程序可以有效地處理數千個或更多的組件。* * – Wolf 2016-10-25 10:06:18

15

您永遠不會更改組件/ @ Guid。您也不會更改組件中的資源(文件,註冊表鍵,快捷鍵,類型庫等)。當你有一個新的資源時,你必須用一個新的@Guid創建一個新的組件。真正棘手的部分是新組件可能與舊組件沒有重疊(認爲文件路徑或註冊表鍵路徑或typelib等)。

這些基本上是組件規則,請查看:http://robmensching.com/blog/posts/2003/10/18/Component-Rules-101

+0

將組件安裝的位置作爲任何效果執行嗎? – Rohit 2009-09-10 15:02:47

+1

是和不是。 :)如果您更改Component/@目錄,那麼您不必*更改組件/ @ Guid,但如果您想要......只要組件中沒有其他資源(如註冊表項)即可。如果組件中有其他資源,並且您將其更改爲Guid,則所有資源都需要一個新的名稱或路徑。當然,新的位置會照顧文件。 不,組件規則並不簡單。 – 2009-09-11 10:49:28

+0

@RobMensching。如果我們在Heat中使用-ag選項會怎樣?正如我們所知,它在鏈接時根據Glytzhkof在上面的響應中定義的場景生成ComponentIds。在所有這些註釋之後添加了 – 2014-02-18 04:04:24