在wix中更改我的组件GUID?

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

Glytzhkof编辑 :为了澄清,该问题处理何时应该更改MSI组件的组件GUID。 一个组件可以改变的方面,如:改变目的地path,添加或删除文件到/从相同的组件,添加registry数据等…这导致问题的所谓的组件引用,即最佳做法在MSI中创build组件 。

MSI的总体概念是组件GUID (唯一标识符)和绝对path (安装位置/关键path)之间存在1:1映射 。 完整的path,包括文件名,如果有的话。 请参阅下面的更新以获得一个新的Wixfunction来自动处理这个问题。

我使用一些简单的规则来处理过于复杂和无意义的组​​件规则:

  • 每个文件始终使用一个单独的组件(即使对于非二进制文件)。 这避免了各种问题。 有一些例外:
    • 多文件的.NET程序集应该都在一个组件中,因为它们应该总是作为一个单元来安装/卸载。
    • 一些其他的一般文件types进来“匹配对” – 他们属于一起。 通常这些是内容和索引文件。 例如,考虑Microsoft帮助文件:
      • .HLP和.CNT文件归在一起。
      • .CHM和.CHI文件归在一起。
    • 有可能有几个这样的文件types属于一起,因此应该放在同一个组件,所以他们一起安装/卸载 – 我怀疑某些证书文件是候选人。 很难拿出一个明确的名单。 只要问自己“这些文件总是属于一起” – 所以每当有新版本时,它们总是成对出现? 如果是,则通过相同的组件安装它们。 将版本化的文件(如果有)设置为密钥文件。
  • 记住,一旦你为一个组件分配了一个GUID,它就被设置为该组件的关键path(绝对path)。 如果将文件移动到新位置或重命名文件,请为其指定一个新的组件GUID(因为绝对path不同,它实际上是新的标识)。
  • 总之,组件GUID绑定到绝对安装位置,而不是特定的文件。 如果移动,GUID不会跟随文件
  • 不要添加或删除现有组件中的文件。 各种升级和修补问题的结果。

一些样品:

  • 您将文件C:\ Program Files \ MyCompany \ MyApp \ MyFile.exe重命名为C:\ Program Files \ MyCompany \ MyApp \ MyFile_NEW.exe 。 这对组件创build意味着什么? 这是一个新的绝对安装path,因此您为托pipe组件生成一个新的GUID,或者添加一个新组件并删除旧组件(具有相同的效果)。
  • 您更新的MSI提供了MyFile.exe的新版本。 位置与以前相同,这意味着组件的GUID不应该改变。

更新 :WIX现在有一个新的自动生成组件GUIDfunction,只要目标path保持不变,就可以计算GUID 。 我没有尝试过这个说实话,但很多人似乎没有任何问题, 罗曼Mensching(WIX作者)说,正常使用是安全的 。 作为一个概念,我强烈推荐这个,因为它具有一些自动魔法,并且避免了一些复杂的问题。

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

你永远不会改变组件/ @ Guid。 您也永远不会更改组件中的资源(文件,registry键,快捷键,types库等)。 当你有一个新的资源,你必须创build一个新的组件与一个新的@Guid。 真正棘手的部分是新的组件可以与旧的组件没有重叠(认为文件path,或registry键path,或typelib等)。

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

查看WiX教程,The Files Inside ,了解组件规则的详细说明。 基本上,它说你永远不会改变一个组件的GUID,因为这意味着孤立旧的组件,并创build一个新的组件。