30

我应该何时更改或不更改 WIX 中的组件 GUID? Microsoft SDK 信息令人困惑

Glytzhkof 编辑:为了澄清,问题涉及何时应为 MSI 组件更改组件 GUID。组件可以随以下方面发生变化:更改目标路径,向/从同一组件添加或删除文件,添加注册表数据等......这会导致所谓的组件引用问题,即最佳实践在 MSI 中创建组件。

4

3 回答 3

50

MSI 的总体概念是组件 GUID(唯一标识符)和绝对路径 (安装位置/密钥路径)之间存在1:1 映射。完整路径,包括文件名(如果有)。请参阅下面的更新以了解自动处理此问题的新 Wix 功能。


Rob Mensching(WiX 作者):

更多关于组件规则:


我使用一些简单的规则来处理过于复杂且违反直觉的组件规则(尤其是针对开发人员而不是部署专家):

  • 始终为每个文件使用单独的组件(即使对于非二进制文件)。这样可以避免各种问题。有几个例外:
    • 多文件 .NET 程序集应该都在一个组件中,因为它们应该始终作为一个单元安装/卸载。
    • 其他一些通用文件类型“匹配对”形式出现- 它们属于一起。通常这些是内容和索引文件。以 Microsoft 帮助文件为例:
      • .HLP 和 .CNT 文件属于同一个文件。
      • .CHM 和 .CHI 文件属于同一个文件。
    • 可能有几种此类文件类型属于一起,因此应该放在同一个组件中,以便它们一起安装/卸载 - 我怀疑某些证书文件是候选文件。很难拿出一个明确的清单。简单地问自己“这些文件总是属于一起吗” - 所以每当有新版本时它们总是成对出现?如果是,则通过相同的组件安装它们。将版本控制文件(如果有)设置为密钥文件。
    • 我想添加驱动程序文件作为始终属于一起的一堆文件的示例:SampleDriver.cat, SampleDriver.inf, 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 不应更改。它是同一个文件(身份),只是版本不同。

更新

自动组件 GUID:WIX 现在有一个新auto-generate component GUID功能,calculates a GUID只要目标路径保持不变。老实说,我还没有尝试过,但很多人似乎都可以毫无问题地使用它,并且Rob Mensching (Wix author) states it is safe for normal use. 作为一个概念,我强烈推荐这个,因为它具有一些自动魔法并保护你免受一些复杂性的影响。

最小的 WiX 标记:另请注意,您可以从 Wix xml 文件中省略很多源属性,并依赖 Wix 默认值而不是硬编码值。

于 2009-09-14T15:02:32.470 回答
18

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

这些基本上是组件规则,请查看:https ://robmensching.com/blog/posts/2003/10/18/component-rules-101/ 。

于 2009-09-10T14:29:05.013 回答
0

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

于 2009-09-10T12:55:26.283 回答