将条目添加到 MSI UpgradeTable 以删除相关产品

Adding entries to MSI UpgradeTable to remove related products

WiX 安装程序产品节点具有属性 UpgradeCode. It is used to refer to previous versions of the same product. The value is stored in the UpgradeTable. The UpgradeTable is parsed by the FindRelatedProducts 操作。

UpgradeCode 允许删除以前具有相同 UpgradeCode 的产品。但计划是将几个过时的遗留产品集成到一个组合的单一产品中。此遗留产品的 UpgradeCode 是已知的。我希望将此代码添加到 UpgardeTable 也将删除此遗留产品。这可以通过填写升级表来完成。

如何在 WiX 设置中的 UpgradeTable 中添加更多条目?

编辑:需要什么语法?

有没有更好的方法来删除升级后过时的产品?

只需根据需要添加 Upgrade 和 UpgradeVersion 元素。这一切都行得通。您可能正在使用 MajorUpgrade 元素,并且您可能没有意识到那些其他元素。

Short Answer: You add several Upgrade Element entries in your WiX source which will create several rows in the compiled MSI's Upgrade Table which then list products that are to be uninstalled during installation (or that can abort your installation). You must be very careful about the options you specify for each product family to uninstall.


主要升级失败:这是一个列表,通过识别最常见的问题来帮助调试失败的主要升级:.


并行安装:请注意,在主要升级期间卸载旧版本的替代方法是让您的新版本足够隔离,能够与现有安装共存。这种隔离可能具有挑战性,并且完全是另一回事(防止:争夺文件关联、不兼容的 COM 服务器安装、不兼容的运行时、冲突的服务、配置文件和注册表项的意外锁定等)。


MajorUpgrade Element: Newer versions of WiX feature a "convenience feature" for major upgrade implementation in the form of the MajorUpgrade element。此元素简化了正常主要升级的实施。

Upgrade Element:在早期版本的 WiX 中,必须使用更多基本元素来实现重大升级。这个元素仍然可用,它是你需要做的更精细和细粒度的升级Table配置。

Wim Coenen 在这里很好地说明了使用这些方法之间的区别:Majorupgrade or Upgrade ID which is preferred for Major upgrade? 我认为这个解释是太好了,我拒绝在这里重复太多:-)。请快速阅读。


主要升级配置选择:以下只是一个示例。重大升级的实际配置必须在每个案例中仔细推理:

  • 如果找到更高版本,是否要中止?
  • 来自哪个产品线?
  • 错误信息是什么?
  • 如果旧版本的卸载失败,您要继续吗?
  • 是否允许低版本卸载高版本? (请不要)。
  • 是否允许相同版本自行卸载并重新安装?

您显然必须为此做好计划并进行详细测试。下面是一个模型。这结合了 MajorUpgrade 元素和 Upgrade 元素的使用。您还可以仅依靠升级元素来“手动”执行更细粒度控制的操作:

<!-- Major upgrade - Your New Product Line, using the MajorUpgrade convenience element -->
<MajorUpgrade DowngradeErrorMessage="A later version of [ProductName] is already installed" />

<!-- Older Product Line 1: Upgrade Code -->
<Upgrade Id="{11111111-1111-1111-1111-000000000000}">
   <UpgradeVersion Property="PRODUCTLINE1" IncludeMinimum="yes" Minimum="0.0.0" />
</Upgrade>

<!-- Older Product Line 2: Upgrade Code -->
<Upgrade Id="{22222222-2222-2222-2222-000000000000}">
   <UpgradeVersion Property="PRODUCTLINE2"  IncludeMinimum="yes" Minimum="0.0.0" />
</Upgrade>

<!-- Older Product Line 3: Upgrade Code -->
<Upgrade Id="{33333333-3333-3333-3333-000000000000}">
   <UpgradeVersion Property="PRODUCTLINE3"  IncludeMinimum="yes" Minimum="0.0.0" />
</Upgrade>

我建议您更改这些 PRODUCTLINE 属性的名称,这些属性本质上可以理解为特定的产品线。换句话说,如果您卸载 WiX3,您将其称为 WIX3PRODUCTLINE 等...这样生成的日志文件更容易理解。

升级示例Table:

Upgrade Table 属性列 对于控制主要升级的行为很重要。继续卸载失败等...

以及可用于查看已编译 MSI 文件的免费工具列表(对于可能找到此答案的人):


更新:

  • (重大升级失败的潜在原因)

较早的条目:

还想将您发送到 WiX 专家 Neil Sleightholm 的网站 以获得一些过时但仍然不错的真实示例: