在 wix 中更改我的组件 GUID?
-
05-07-2019 - |
题
我什么时候应该更改或不更改 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.exe 到 C:\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,因为这意味着孤立旧组件并创建新组件。