是否可以在不同的产品安装中复制 WiX 组件 GUID

问题描述

我正在过滤现有的问题,但我看到的没有一个在这个基本级别上明确回答这个问题。我正在记事本中构建我的 WXS 文件,而不是从 IDE。

我的情况是:我有多个应用程序使用一些相同的程序集。这些程序集与 exe 一起安装到单独的应用程序文件夹中,因此它们不会相互共享。它们可能是不同的版本。文件夹看起来像:

App1:main1.exe、1.dll、2.dll
App2: main2.exe,1.dll
App3:main3.exe、1.dll、2.dll

我正在制作 WXS 文件的模板,但在我走得太远之前,我想弄清楚是否可以跨应用程序复制/粘贴组件元素。

App1.wxs:

<Component Id='AudioLibrary' Guid='1111-1111111-1111111-11111' Win64='yes'>
    <File Id='AudioDLL' Source='1.dll' KeyPath='yes' />

App2.wxs

<Component Id='AudioLibrary' Guid='1111-1111111-1111111-11111' Win64='yes'>
    <File Id='AudioDLL' Source='1.dll' KeyPath='yes' />

这两个条目是否会在跨不同应用程序的升级/卸载操作中相互干扰?

通常,数据库结构允许这种类型的重复,因为父项将是唯一的产品 guid。但我看到很多抱怨说 MSI 一定是在 70 年代写的,当时每个人都喜欢酸。因此,在我浪费时间构建一切之前,先检查一下我是否为失败做好了准备。

编辑:我还想将其应用到 sql 脚本组件;我可以将代码片段复制/粘贴到任何 wxs 文件中,而不必为其生成新的 GUID 吗?

解决方法

组件 GUID 和绝对路径:请阅读这个旧答案:When to change component GUIDS。本质上,绝对路径和组件 GUID 之间存在 1:1 的关系。如果更改文件名或安装到不同的文件夹,则必须创建新的组件 GUID。因此,如果您将所有产品安装到同一个文件夹,您应该为您安装的产品使用相同的组件 GUID。如果您将每个产品安装到一个新文件夹中,它们应该具有不同的组件 GUID。

合并模块:共享组件通常通过 merge modules 安装。作为一个概念,我个人更喜欢 WiX 包含文件而不是合并模块。

WiX Include Files:WiX 包含文件的前提是您可以在其自己的源代码和 include in any number of setups 中声明一组组件一次 - 就像 C++ 头文件一样。如果您let the component GUIDs be auto-generated,您应该能够在不同的 MSI 文件中包含相同的 WiX 包含文件,并且该逻辑将负责为组件生成新的 GUID 或使用相同的 GUID,具体取决于它们在磁盘上的目标位置。 我尚未对此进行测试Here is Rob Mensching himself on the auto-GUID concept


链接: