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

标签 wix windows-installer major-upgrade

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

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

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

编辑:需要什么语法?

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

最佳答案

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.


重大升级失败:以下列表通过识别最常见的问题来帮助调试失败的重大升级:Common causes of failed major upgrades .


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


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

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

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 等...这样生成的日志文件更易于理解。

升级表示例:

Upgrade Table

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

以及可用于查看已编译 MSI 文件的免费工具列表(适用于任何可能找到此答案的人):How can I compare the content of two (or more) MSI files?


更新:

较早的条目:

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

关于wix - 将条目添加到 MSI UpgradeTable 以删除相关产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51801570/

相关文章:

c# - 主要输出是 "obj"文件夹而不是 "bin"

.net - 使用软件更新更新 SQL Server 数据库架构

wix - Majorupgrade 或 Upgrade ID 哪个是主要升级的首选?

wix - 在wix中,可以为网站设置应用程序池吗?

wix - 自定义操作 DLL 依赖于另一个 DLL

wix - 如何在两个 WiX 项目中共享一个 WiX 片段?

windows - 如何使 vcredist 成为我的 MSI 安装程序的启动条件?

wix - wix主要升级未安装所有文件

wix - 如何根据磁盘大小动态修改 Wix DiskCostDlg 消息?