WIX:仅防止更新某些旧版本

问题描述

我们有一些产品,使用 WIX 作为安装程序技术。安装程序中的升级处理由 MajorUpgrade 元素

处理
<Wix>
  <Product Id="..." Name="..." Language="..."
    Version="..." Manufacturer="..."
    UpgradeCode="...">
...

    <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" AllowSameVersionUpgrades="yes" />
  </Product>
</Wix>

如您所见,到目前为止,我们支持从所有旧版本升级,但是我们必须稍微更改一下,以便只能升级比某个版本新的版本,而旧版本会收到错误消息并且升级失败.

根据我的研究,使用 Upgrade 元素应该可以做到这一点(如 https://www.firegiant.com/wix/tutorial/upgrades-and-modularization/checking-for-oldies/ 中所述)

我现在的问题:

  • 是否可以/建议混合使用 MajorUpgradeUpgrade 元素?
  • 是否有更好的方法来实现这一目标?

更新

感谢您的回复和解答,我使用的解决方案如下:

<Wix>
  <Product Id="..." Name="..." Language="..."
    Version="..." Manufacturer="..."
    UpgradeCode="My_upgrade_code">
...

    <InstallExecuteSequence>
...
      <Custom Action='UpdateFromVersionNotSupported' After='FindRelatedProducts'>UNSUPPORTEDUPDATEVERSIONFOUND</Custom>
...
    </InstallExecuteSequence>
    <MajorUpgrade DowngradeErrorMessage="!(loc.DowngradeError)" AllowSameVersionUpgrades="yes" />

    <Upgrade Id='My_upgrade_code'>
        <UpgradeVersion OnlyDetect='yes' Property='UNSUPPORTEDUPDATEVERSIONFOUND' Maximum='Oldes_version_where_update_is_allowed' IncludeMaximum='no' />
    </Upgrade>

    <CustomAction Id='UpdateFromVersionNotSupported' Error='Updates are only supported from version ?? or later' />

  </Product>
</Wix>

解决方法

应该有几种方法:

  1. 新升级代码:更改升级代码会使旧版本和新版本解耦吗?您可以将两个升级代码添加到升级表并以不同方式处理它们。请参阅下图和this answer

    Upgrade code

  2. 版本控制:您还可以使用版本匹配来仅升级某些 MSI 版本。 Upgrade Table documentation。换句话说,将最大和最小版本设置为每个升级表条目的目标。您可以不断添加行以不同方式处理不同版本。像这样的东西(只是一个粗略的模型):

    InstallShield Upgrade Table

WiX 构造:您可以混合搭配现代 WiX 便利元素 使用更旧和更灵活的元素。 See this answer

Side-By-Side MSI:请注意,如果您想在同一台计算机上install the same MSI twice,除非您努力隔离实例,否则将导致干扰(COM serversfile associationsservicesetc... strong> - 任何 machine-wideinterference capable)。最糟糕的通常是通过注册表访问已注册的系统范围内的事物(除非它具有多实例能力)。 More technical information here。虚拟化有帮助吗?详情请参阅链接。

,

您需要使用升级元素。

https://wixtoolset.org/documentation/manual/v3/xsd/wix/upgrade.html

https://wixtoolset.org/documentation/manual/v3/xsd/wix/upgradeversion.html

您需要编写 2 条规则。一种允许升级版本 X 或更高版本。这可以是您的标准 MajorUpgrade 元素。另一个检测版本