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

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

有帮助吗?

解决方案

MSI 的总体概念是: 1:1 映射 在a之间 组件GUID (唯一标识符)和 绝对路径(安装位置/关键路径)。完整的路径,包括文件名(如果有)。请参阅下面的更新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.exeC:\Program Files\MyCompany\MyApp\MyFile_NEW.exe. 。这对于组件创建意味着什么?这是一个新的绝对安装路径,因此您可以为托管组件生成一个新的 GUID,或者添加一个新组件并删除旧组件(具有相同的效果)。
  • 更新后的 MSI 提供了新版本的 MyFile.exe。该位置与以前相同,这意味着组件 GUID 不应更改。这是相同的文件(身份),只是版本不同。

更新: :WIX 现在有一个新的 自动生成组件 GUID 特点是 计算 GUID 只要目标路径保持不变。说实话,我还没有尝试过,但很多人似乎都没有问题地使用它,并且 Rob Mensching(Wix 作者)表示正常使用是安全的. 。作为一个概念,我强烈推荐这个,因为它具有一些 自动魔法 并保护您免受某些复杂性的影响。

另请注意 您可以从 Wix xml 文件中省略大量源属性 并依赖 Wix 默认值而不是硬编码值。

其他提示

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top