多个依赖产品的 WIX MSI 安装程序升级

时间:2021-04-01 03:38:34

标签: wix windows-installer

我们有多种产品。所有这些都可以单独安装,也可以同时安装。所有这些都作为单个 MSI 文件发送。现在的问题是升级。如果有人为一种产品获得了新的 MSI,它必须至少适合所有其他已安装产品的主要版本。

使用不同升级代码的测试失败,因为如果所有都安装了并且每个都有规则只允许在同一主要版本中进行更新,您可以卸载一个产品而不是安装任何版本,因为没有交叉检查

阅读文档:

https://docs.microsoft.com/en-us/windows/win32/msi/upgradecode

<块引用>

UpgradeCode 属性是一个 GUID,代表一组 UpgradeCode 用于在升级表中搜索 已安装的产品的相关版本。

这听起来我们可以对所有产品使用相同的升级 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 升级

从另一篇文章来看,一个明确的解决方案似乎给每个产品一个自己的密钥,但比测试更复杂,我必须知道任何产品中的所有密钥.. Adding entries to MSI UpgradeTable to remove related products< /p>

  • 产品 A .. 更新代码 X
  • 产品 B .. 更新代码 Z
  • 产品 C .. 更新代码 Y

在安装 A

  • 如果有更新代码 X 并且主要版本适合升级
  • 如果存在更新代码 Z 且主要版本适合升级
  • 如果更新代码 Y 存在,则中止

安装B

  • 如果存在更新代码 Z 并且主要版本适合升级
  • 如果存在更新代码 x 并且主要版本适合升级
  • 如果更新代码 Y 存在,则中止

在安装 C

  • 如果更新代码 X 或 Z 存在中止
  • 如果更新代码 Y 存在,则升级

问候

1 个答案:

答案 0 :(得分:0)

它似乎使用相同的升级 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>
相关问题