1

我正在尝试使用计划在标准操作InstallInitialiseInstallFinalize标准操作之间的自定义操作来删除文件。

MajorUpgrade element用于设计升级。

但是,我希望自定义操作仅在卸载期间运行,而不是在主要升级期间运行(这包括卸载和安装)。

我使用以下条件来执行 CUstom 操作:

  1. (NOT UPGRADINGPRODUCTCODE) AND (REMOVE="ALL")
  2. REMOVE AND NOT WIX_UPGRADE_DETECTED

有没有办法使用 Wix 中的属性来唯一地检测主要升级?

4

2 回答 2

3

菲尔已经回答了。我将在出发前发布几个小时前写的内容。你指定的条件对我来说看起来不错。也许我会快速回顾一下可能会引起混淆的事情——比如什么时候运行自定义操作?


主要升级:主要升级实际上是安装新应用程序版本并卸载旧版本 - 可能有不同的卸载计划(卸载旧版本并安装新版本,或安装新版本并卸载旧版本)。因此,在主要升级操作期间,卸载序列仅针对旧安装程序运行,而新安装程序仅运行其安装序列。这对于了解自定义操作何时以及为何运行至关重要。1) 2)

自定义操作和主要升级:换句话说:这种排序可能会对自定义操作排序造成相当大的混淆,因为它可能看起来是从新设置运行的操作,而实际上它是在旧设置的卸载中运行的序列。如果您对排序草率,典型的错误是在升级过程中看到相同的操作多次运行 - 每个设置可能两次(总共四次) - 如果您在立即模式下运行自定义操作。

重大升级不进行改造:正如 Phil 解释的那样,您不能在新设置中添加将在旧设置的卸载序列期间运行的自定义操作。该自定义操作必须是原始设置的一部分,或者通过次要升级添加(即就地升级现有安装,而不是卸载并重新安装它)。

重要

  • UPGRADINGPRODUCTCODE仅在作为主要升级的一部分被卸载的设置中设置。在安装的新版本中没有设置。
    • UPGRADINGPRODUCTCODE因此,安装设置中的条件不成立,仅在卸载设置中。
  • WIX_UPGRADE_DETECTED仅在使用 WiX 的 MajorUpgrade 元素的设置中设置,该元素已检测到另一个版本正在作为其安装的一部分被卸载。
    • WIX_UPGRADE_DETECTED因此,该条件在安装设置中为,但在卸载设置中不成立。

WIX_UPGRADE_DETECTED:更详细地说,用于为升级过程WIX_UPGRADE_DETECTED设置内置 MSI 属性的 WiX 标准或约定ActionProperty所有支持重大升级的 MSI 文件都有这样的属性,WiX 只是以标准方式命名。该属性设置在“升级”表的列中,并且当安装程序在安装过程中在同一框中找到相关产品(较低版本(因此将被卸载))时设置该属性。

WIX_DOWNGRADE_DETECTED:请注意,在使用 MajorUpgrade 元素的标准 WiX 编译 MSI 中,还有WIX_DOWNGRADE_DETECTED- 用于列出发现的版本高于运行设置的产品的属性。这些会阻止安装有问题的设置 - 在大多数情况下(除非设置是由设置设计者自定义的)。

升级表中指定的操作属性可以是“任何东西”,但MajorUpgrade 元素的“便利功能”以一种对大多数用途都有意义的“自动魔法”方式为您执行此操作 - 使用提到的属性名称WIX_UPGRADE_DETECTEDWIX_DOWNGRADE_DETECTED. 检查您编译的 MSI 的升级表以了解其工作原理的详细信息。这是一个屏幕截图:

已编译的 WiX MSI 升级表


我写了这个另一个答案,展示了如何使用另一个属性名称(YOURUPGRADEPROPERTY)作为“ ActionProperty”:wix安装程序更新过程和确认对话框(链接的答案不是建议,仅供演示)。只是一个链接,现在我考虑一下可能对您不是很有用。

一些链接

于 2018-06-28T19:33:51.583 回答
2

您是否要在较旧的已安装产品(可能已经发货,因此如果没有补丁等更新就无法更改)还是在较新的升级安装中执行此操作并不明显。

我还假设您已经查看了 RemoveFile 元素,但它不符合您的要求。

UPGRADINGPRODUCTCODE 属性适用于升级和卸载的旧产品。如果该文件属于该已安装产品,并且您只想在卸载时使用该旧安装中的自定义操作将其删除,则自定义操作的条件将是:

REMOVE="ALL" 而不是 UPGRADINGPRODUCTCODE

但正如我所说,该自定义操作需要已经在较旧的安装产品中,并且您无法在升级 MSI 中执行任何操作来解决此问题。

如果要从升级中删除文件,则升级期间的条件仅为:

WIX_UPGRADE_DETECTED

说明您的主要升级在哪里进行排序也可能会有所帮助。如果它是早期的(例如在 InstallInitialize 前后),那么升级基本上是卸载旧产品,然后安装新产品,如果这就是您所看到的,这可能与文件的删除有关。

于 2018-06-28T17:38:47.087 回答