多个依赖产品的 WIX MSI 安装程序升级
WIX MSI installer upgrade for multiple depended products
我们有多种产品。所有这些都可以单独安装,也可以同时安装。所有都作为单个 MSI 文件发送。现在的问题是升级。如果某人获得了一个产品的新 MSI,它必须至少适合所有其他已安装产品的主要版本。
使用不同升级代码的测试失败,因为如果所有都安装了并且每个都有规则只允许在同一主要版本中更新,您可以卸载一个产品而不是安装任何版本,因为没有交叉检查
正在阅读文档:
https://docs.microsoft.com/en-us/windows/win32/msi/upgradecode
The UpgradeCode property is a GUID representing a related set of
products. The UpgradeCode is used in the Upgrade Table to search for
related versions of the product that are already installed.
这听起来我们可以对所有产品使用相同的升级 GUID,并且安装程序可以管理而不是检测两者的产品版本。
这是正确的方法吗?
或者我们应该创建一个注册表项“产品主要版本”并将其作为所有 MSI 文件的中央存储进行检查。
样本:
更多详细信息.. 每个产品都是一个单独的 MSI 文件
- 产品 A
- 产品 B
- 产品 C
产品 A 和 B 可以单独安装,但如果它们在同一台计算机上,则它们的主要版本必须适合
产品 C 是排他性的,这意味着它不能与 A 或 B 共存
具有相同更新 guid 的基本想法是
- 产品 A ..更新代码 X
- 产品 B ..更新代码 X
- 产品 C ..更新代码 Y
在安装 A 或 B 时进行两个测试
- 如果更新代码 Y 在这里中止
- 如果更新代码 X 存在,则检查主版本,如果不适合则中止,或者安装或升级 A 或 B
安装 C
- 如果更新代码 X 存在则中止
- 如果有更新代码 Y 升级
从另一篇文章来看,一个明确的解决方案似乎为每个产品提供了一个自己的密钥,但比测试更复杂,我必须知道任何产品中的所有密钥..
- 产品 A ..更新代码 X
- 产品 B ..更新代码 Z
- 产品 C ..更新代码 Y
安装 A
- 如果更新代码 X 存在并且主要版本适合升级
- 如果更新代码 Z 存在并且主要版本适合升级
- 如果更新代码 Y 存在则中止
安装 B
- 如果更新代码 Z 存在并且主要版本适合升级
- 如果更新代码 x 存在并且主要版本适合升级
- 如果更新代码 Y 存在则中止
安装 C
- 如果更新代码 X 或 Z 存在则中止
- 如果更新代码 Y 有升级
此致
它似乎与相同的升级 ID 一起工作。在安装日志中我们可以看到所有相关的产品共享由“;”分隔的 GUID。
Action start 15:07:46: FindRelatedProducts.
FindRelatedProducts: Found application: {E9C16B5B-DEFC-4257-B378-6BDA6724EAA3}
MSI (c) (68:D0) [15:07:46:467]: PROPERTY CHANGE: Adding PREVIOUSVERSIONSINSTALLED property. Its value is '{E9C16B5B-DEFC-4257-B378-6BDA6724EAA3}'.
FindRelatedProducts: Found application: {3C0B5AA4-2C04-4C51-9CDA-199367DD5D5B}
MSI (c) (68:D0) [15:07:46:467]: PROPERTY CHANGE: Modifying PREVIOUSVERSIONSINSTALLED property. Its current value is '{E9C16B5B-DEFC-4257-B378-6BDA6724EAA3}'. Its new value: '{E9C16B5B-DEFC-4257-B378-6BDA6724EAA3};{3C0B5AA4-2C04-4C51-9CDA-199367DD5D5B}'.
Action ended 15:07:46: FindRelatedProducts. Return value 1.
无论如何我必须在此处添加它以避免由于共享 GUID
在安装运行之前卸载
<InstallExecuteSequence>
<RemoveExistingProducts Before='InstallInitialize'>0</RemoveExistingProducts>
</InstallExecuteSequence>
我们有多种产品。所有这些都可以单独安装,也可以同时安装。所有都作为单个 MSI 文件发送。现在的问题是升级。如果某人获得了一个产品的新 MSI,它必须至少适合所有其他已安装产品的主要版本。
使用不同升级代码的测试失败,因为如果所有都安装了并且每个都有规则只允许在同一主要版本中更新,您可以卸载一个产品而不是安装任何版本,因为没有交叉检查
正在阅读文档:
https://docs.microsoft.com/en-us/windows/win32/msi/upgradecode
The UpgradeCode property is a GUID representing a related set of products. The UpgradeCode is used in the Upgrade Table to search for related versions of the product that are already installed.
这听起来我们可以对所有产品使用相同的升级 GUID,并且安装程序可以管理而不是检测两者的产品版本。
这是正确的方法吗?
或者我们应该创建一个注册表项“产品主要版本”并将其作为所有 MSI 文件的中央存储进行检查。
样本:
更多详细信息.. 每个产品都是一个单独的 MSI 文件
- 产品 A
- 产品 B
- 产品 C
产品 A 和 B 可以单独安装,但如果它们在同一台计算机上,则它们的主要版本必须适合
产品 C 是排他性的,这意味着它不能与 A 或 B 共存
具有相同更新 guid 的基本想法是
- 产品 A ..更新代码 X
- 产品 B ..更新代码 X
- 产品 C ..更新代码 Y
在安装 A 或 B 时进行两个测试
- 如果更新代码 Y 在这里中止
- 如果更新代码 X 存在,则检查主版本,如果不适合则中止,或者安装或升级 A 或 B
安装 C
- 如果更新代码 X 存在则中止
- 如果有更新代码 Y 升级
从另一篇文章来看,一个明确的解决方案似乎为每个产品提供了一个自己的密钥,但比测试更复杂,我必须知道任何产品中的所有密钥..
- 产品 A ..更新代码 X
- 产品 B ..更新代码 Z
- 产品 C ..更新代码 Y
安装 A
- 如果更新代码 X 存在并且主要版本适合升级
- 如果更新代码 Z 存在并且主要版本适合升级
- 如果更新代码 Y 存在则中止
安装 B
- 如果更新代码 Z 存在并且主要版本适合升级
- 如果更新代码 x 存在并且主要版本适合升级
- 如果更新代码 Y 存在则中止
安装 C
- 如果更新代码 X 或 Z 存在则中止
- 如果更新代码 Y 有升级
此致
它似乎与相同的升级 ID 一起工作。在安装日志中我们可以看到所有相关的产品共享由“;”分隔的 GUID。
Action start 15:07:46: FindRelatedProducts.
FindRelatedProducts: Found application: {E9C16B5B-DEFC-4257-B378-6BDA6724EAA3}
MSI (c) (68:D0) [15:07:46:467]: PROPERTY CHANGE: Adding PREVIOUSVERSIONSINSTALLED property. Its value is '{E9C16B5B-DEFC-4257-B378-6BDA6724EAA3}'.
FindRelatedProducts: Found application: {3C0B5AA4-2C04-4C51-9CDA-199367DD5D5B}
MSI (c) (68:D0) [15:07:46:467]: PROPERTY CHANGE: Modifying PREVIOUSVERSIONSINSTALLED property. Its current value is '{E9C16B5B-DEFC-4257-B378-6BDA6724EAA3}'. Its new value: '{E9C16B5B-DEFC-4257-B378-6BDA6724EAA3};{3C0B5AA4-2C04-4C51-9CDA-199367DD5D5B}'.
Action ended 15:07:46: FindRelatedProducts. Return value 1.
无论如何我必须在此处添加它以避免由于共享 GUID
在安装运行之前卸载<InstallExecuteSequence>
<RemoveExistingProducts Before='InstallInitialize'>0</RemoveExistingProducts>
</InstallExecuteSequence>