在wix中更改我的组件GUID?

问题描述 投票:26回答:3

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

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

wix windows-installer wix3
3个回答
47
投票

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

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

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

更新:

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

最小的WiX标记:还要注意you can leave out a lot of source attributes from your Wix xml file并依赖于Wix默认值而不是硬编码值。


17
投票

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

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


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.