降级会删除新版本的可执行文件,但不会重新安装旧版本

Posted

技术标签:

【中文标题】降级会删除新版本的可执行文件,但不会重新安装旧版本【英文标题】:Downgrade removes new versions of executables but does not reinstall old versions 【发布时间】:2019-10-08 14:36:07 【问题描述】:

我已经构建了两个版本的应用程序安装程序。一个版本 1.0.0.0 和一个版本 1.0.1.0。 在预构建步骤中,应用程序的可执行文件会添加所选版本。

为了允许降级,将 MajorUpgrade 中的 AllowDowngrades 属性设置为“yes”。

安装 1.0.0.0 后,我通过运行 1.0.1.0 安装程序来升级安装。可执行文件已正确升级。 然后我再次运行 1.0.0.0 安装程序以将安装降级回 1.0.0.0。 安装完成,1.0.1.0 版本的可执行文件被删除; 但不会重新安装版本为 1.0.0.0 的可执行文件。他们只是失踪了。

我不明白为什么会这样。我可以理解安装程序是否拒绝覆盖较新的可执行文件,但为什么要删除较新的可执行文件? 我还需要做些什么才能使降级成为可能吗?

我的 Product.wxs 的开头:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi"
     xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">
  <!-- Including defines. -->
  <?include Defines.wxi ?>
  <Product Id="*"
        Name="$(var.ProductName) $(var.MajorMinorVersion)"
        Language="1033"
        Version="$(var.ProductVersion)"
        Manufacturer="$(var.Manufacturer)"
        UpgradeCode="$(var.UpgradeGuid)">

    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />

    <MajorUpgrade Schedule="afterInstallInitialize" AllowDowngrades='yes' AllowSameVersionUpgrades='no' />
    ...

【问题讨论】:

尝试将 MajorUpgrade 计划设置为 afterInstallValidate 并再次测试 - 看看是否可行。问题与 MSI 错误有关。降级是一种不好的做法,你能消除它吗? 出于相当尴尬的原因,我无法消除它。设置“afterInstallValidate”不起作用。 【参考方案1】:

REINSTALLMODE 必须从默认的 omus 更改为 amus

<Property Id="REINSTALLMODE" Value="amus" />

来自微软文档:

o   Reinstall if the file is missing or is an older version.
a   Force all files to be reinstalled, regardless of checksum or version.

通过此更改,可执行文件将在正确版本的降级时重新安装。

【讨论】:

如果您的 MSI 中有任何合并模块或共享文件,这可能会导致一些不幸的副作用,主要是文件降级和文件版本不一致。 您也可以意外覆盖设置文件 - 我上次检查过。你也查? :-)。 幸运的是,安装程序非常基础,不必面向未来。是的,一个自定义对话框询问是否应该覆盖配置文件。

以上是关于降级会删除新版本的可执行文件,但不会重新安装旧版本的主要内容,如果未能解决你的问题,请参考以下文章

安卓软件如何降级覆盖安装。

发布新版本的应用程序会删除旧版本的文件吗?

Nodejs - 如何在 ubuntu 中卸载旧版本的 nodejs 并安装新版本的 nodejs

无法删除 esky 0.9.8 中的旧版本:Python

升级时注册表问题

Wix 安装程序不会覆盖以前版本的可执行文件