2

WiX 安装程序产品节点具有属性UpgradeCode。它用于指代同一产品的先前版本。该值存储在UpgradeTable中。UpgradeTable 由FindRelatedProducts操作解析。

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

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

编辑:需要什么语法?

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

4

2 回答 2

4

简短回答:您在 WiX 源中添加了几个升级元素条目,这将在已编译的 MSI升级表中创建几行,然后列出要在安装期间卸载的产品(或可以中止安装的产品)。您必须非常小心为要卸载的每个产品系列指定的选项。


重大升级失败:这里列出了通过识别最常见的问题来帮助调试失败的重大升级的列表:重大升级失败的常见原因


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


MajorUpgrade 元素:较新版本的 WiX 以MajorUpgrade 元素的形式为主要升级实施提供了“便利功能”。此元素简化了正常主要升级的实施。

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

Wim Coenen在这里很好地说明了使用这些方法之间的区别:Majorupgrade 或 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 等...这样生成的日志文件更易于理解。

样品升级表

升级表

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

以及可用于查看已编译 MSI 文件的免费工具列表(对于任何可能找到此答案的人):如何比较两个(或更多)MSI 文件的内容?


更新

较早的条目

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

于 2018-08-11T20:06:23.370 回答
2

只需根据需要添加 Upgrade 和 UpgradeVersion 元素。这一切都行得通。您可能正在使用 MajorUpgrade 元素,而您可能不知道其他元素。

于 2018-08-11T18:32:28.687 回答