WiX 组件 GUID 可以在不同的产品安装中重复吗

问题描述 投票:0回答:2

我正在筛选现有的问题,但我发现没有一个问题能在这个基本层面上明确回答这个问题。我在记事本中构建 WXS 文件,而不是从 IDE 中构建。

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

App1:main1.exe、1.dll、2.dll
应用程序2:main2.exe,1.dll
应用程序3: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 吗?

wix windows-installer
2个回答
1
投票

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

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

WiX 包含文件:WiX 包含文件的前提是您可以在其自己的源中声明一组组件,然后包含在任意数量的设置中 - 就像 C++ 头文件一样。如果您让组件 GUID 自动生成,您应该能够在不同的 MSI 文件中包含相同的 WiX 包含文件,并且逻辑将负责为组件生成新的 GUID 或根据组件上的位置使用相同的 GUID。他们的目标磁盘。 我还没有测试过这个这是 Rob Mensching 本人对自动 GUID 概念的介绍


链接:


0
投票

我忘了回到这个……抱歉。

通过阅读 Stein Åsmul 的链接,我确定解决方案是根本不提供 GUID。

我不确定这是因为它是分层的,并且它继承了父GUID,还是只是生成并分配了新的GUID。如果是后者,如果您正在做补丁,那么“可能”会成为问题,因此请进行额外的研究。然而,就我而言,当我构建并运行新的安装程序时,MSI 会毫无问题地复制旧组件。它说“准备删除旧版本”,所以请预先警告。对我来说这并不重要。 我的节点有 UpgradeCode=THEGUID。组件是不言自明的,我的模板 wxs 包含这三个和其他一些组件。这为我提供了一个功能齐全的模板,我只需要替换一些变量值并删除项目不需要的组件。

<Component Id='MainExecutable' Guid='*' Win64='yes'> <File Id='AppEXE' Source='$(var.ProductName).exe' KeyPath='yes' /> <File Id='AppPDB' Source='$(var.ProductName).pdb' Hidden='yes'/> </Component> <Component Id='CoreLibrary' Guid='*' Win64='yes'> <File Id='CoreDLL' Source='Core.dll' KeyPath='yes' Hidden='yes'/> <File Id='CorePDB' Source='Core.pdb' Hidden='yes'/> </Component> <Component Id='AudioLibrary' Guid='*' Win64='yes'> <File Id='AudioDLL' Source='Audio.dll' KeyPath='yes' /> <File Id='AudioPDB' Source='Audio.pdb' /> </Component>

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