在wix中更改我的组件GUID?

时间:2009-09-10 12:49:19

标签: wix windows-installer wix3

我应该何时更改或不更改WIX中的组件GUID? The Microsoft SDK information is confusing

Glytzhkof编辑:为了澄清,该问题涉及何时应为MSI组件更改组件GUID。组件可以通过以下方面进行更改:更改目标路径,向/从同一组件添加或删除文件,添加注册表数据等...这会导致所谓的组件引用问题,即{{3在MSI。

3 个答案:

答案 0 :(得分:47)

  

MSI的整体概念是两者之间存在 1:1映射   组件GUID (唯一标识符)和绝对路径   (安装位置/密钥路径)。完整路径,包括文件名if   任何。请参阅下面的更新,了解新的Wix功能,以便自动进行处理   有这个。

我使用一些简单规则来处理过于复杂和荒谬的组件规则:

  • 每个文件始终使用单独的组件(即使是非二进制文件)。这避免了各种各样的问题。有一些例外:
    • 多文件.NET程序集应该都在一个组件中,因为它们应始终作为一个单元安装/卸载。
    • 其他一些常规文件类型进入“匹配对” - 它们属于一起。通常这些是内容和索引文件。作为示例,请考虑Microsoft帮助文件:
      • .HLP和.CNT文件属于一起。
      • .CHM和.CHI文件属于一起。
    • 可能有几个这样的文件类型属于一起,因此应该放在同一个组件中,以便它们一起安装/卸载 - 我怀疑某些证书文件是候选者。很难找到明确的清单。只要问自己“这些文件是否总是属于一起” - 所以只要有新版本,它们总是成对出现?如果是,则通过相同的组件安装它们。将版本化文件(如果有)设置为密钥文件。
    • 我想添加驱动程序文件作为一堆总是属于一起的文件的示例: SampleDriver.cat SampleDriver.inf < / strong>, SampleDriver.sys SampleDriver.cer 。它们必须全部匹配作为部署的“单位”。
  • 请记住,一旦为组件分配了GUID,它就会为该组件的关键路径(绝对路径)设置。如果将文件移动到新位置或重命名文件,请为其指定一个新组件GUID(因为绝对路径不同,它实际上是一个新标识)。
  • 在摘要组件中,GUID与绝对安装位置相关联,而不是与特定文件相关联。 如果移动,GUID不会跟随文件。 GUID引用计算绝对位置,而不是文件本身。
  • 不要在现有组件中添加或删除文件。导致各种升级和修补问题。这就是为什么我喜欢每个组件一个文件作为一般规则。
  • 组件引用还有很多,但我会将其留在“概述”中。

一些样本:

  • 您将文件 C:\ Program Files \ MyCompany \ MyApp \ MyFile.exe 重命名为 C:\ Program Files \ MyCompany \ MyApp \ MyFile_NEW.exe 。这对组件创建意味着什么?这是一个新的绝对安装路径,因此您为托管组件生成新的GUID,或者您添加一个新组件并删除旧组件(具有相同的效果)。
  • 您更新的MSI提供了新版本的MyFile.exe。该位置与之前相同,这意味着组件GUID不应更改。它是相同的文件(标识),只是在不同的版本中。

更新:只要目标路径保持不变,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 :(得分:17)

您永远不会更改Component / @ Guid。您也永远不会更改Component中的资源集(File,RegistryKey,Shortcut,TypeLib等)。拥有新资源时,必须使用新的@Guid创建新的Component。真正棘手的部分是新组件与旧组件没有重叠(想想文件路径,或注册表键路径,或类型库等)。

这些基本上是组件规则,请查看:http://robmensching.com/blog/posts/2003/10/18/Component-Rules-101

答案 2 :(得分:0)

有关组件规则的详细说明,请查看WiX Tutorial, The Files Inside。基本上,它表示您永远不会更改组件的GUID,因为这意味着孤立旧组件并创建新组件。