在wix中更改我的组件GUID?

Roh*_*hit 26 windows-installer wix wix3

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

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

Ste*_*mul 47

MSI的总体概念是组件GUID(唯一标识符)和绝对路径(安装位置/密钥路径)之间存在1:1映射.完整路径,包括文件名(如果有).请参阅下面的更新,了解新的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默认值而不是硬编码值.

  • 关于"绝对路径"的部分并不完全正确.您可以将相同的组件(相同的GUID)安装到不同的目录,并且引用计数可以正常工作.目录为上述陈述的简单性留下了皱纹. (5认同)

Rob*_*ing 17

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

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