【问题标题】:Change my component GUID in wix?在 wix 中更改我的组件 GUID?
【发布时间】:2010-11-27 04:00:18
【问题描述】:

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

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

【问题讨论】:

  • 您能否为您的问题添加更多细节?我不确定你在问什么。

标签: wix windows-installer installation wix3


【解决方案1】:

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


Rob Mensching(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。作为一个概念,我强烈推荐这个 因为它具有一些 自动魔法 并保护你免受一些 复杂性。

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

【讨论】:

  • 关于“绝对路径”的部分并不完全正确。您可以将相同的组件(相同的 GUID)安装到不同的目录,并且引用计数可以正常工作。目录使上述陈述的简单性产生了问题。
  • 在使用目录属性对目录表进行文件计算和解析之后,以及在用户(可能)选择了安装目录之后,组件 GUID 将指向绝对键路径吗?我认为查看此问题的最简单方法是关注源文件夹 - 如果您在源文件夹中移动文件,则更改 GUID。实际安装位​​置是一个“移动目标”,直到解析目录为止,但据我所知,您总是以绝对路径作为每个已安装组件的关键路径?
【解决方案2】:

您永远不会更改 Component/@Guid。您也永远不会更改组件中的资源集(文件、注册表项、快捷方式、类型库等)。当你有一个新的资源时,你必须用一个新的@Guid 创建一个新的组件。真正棘手的部分是新组件不能与旧组件重叠(想想文件路径、注册表项路径或类型库等)。

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

【讨论】:

  • 组件安装位置有影响吗?
  • 是和不是。 (像注册表项)。如果组件中有其他资源并且您将其更改为 Guid,则所有资源都需要一个新名称或路径。当然,新位置会处理文件。不,组件规则并不简单。
  • @RobMensching。如果我们在 Heat 中使用 -ag 选项会怎样?众所周知,它是根据 Glytzhkof 在上述响应中定义的场景在链接时生成 ComponentIds。
  • -ag 是在所有这些 cmets 之后添加的,专门用于避免生成组件 Guid 的所有问题。我现在可以为每个组件使用不带 Guids 的组件(这是旧 Guid='*' 语法的首选语法)。
  • 链接已损坏。能否列出组件规则?
【解决方案3】:

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

【讨论】:

  • 该链接很有帮助,但答案对于决定在那里阅读什么并不是很有帮助(并非所有人都有很多时间)。我建议至少添加文章中的引用,例如 [...], a component should only contain items that belong together so strongly that they always need to be installed or removed together. If this means a single file, then your components will contain a single file each. This is not only normal but exactly what you're expected to do. Don't be afraid, Windows Installer can efficiently handle thousands of components or more, if needed.
猜你喜欢
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-16
相关资源
最近更新 更多