【问题标题】:Force uninstalling before installing any version with wix installer在使用 wix 安装程序安装任何版本之前强制卸载
【发布时间】:2014-12-07 19:15:01
【问题描述】:

有谁知道:

  1. 如何强制 wix 安装程序在安装新版本之前卸载任何以前安装的副本,无论是次要版本还是主要版本。

  2. 如果 1) 在运行新的次要/主要设置时无法完成,我是否至少可以显示一条消息,指出检测到以前的版本,应首先将其卸载并取消设置?

谢谢。

更新:

我已将以下内容添加到我的 settings.wxi

<Upgrade Id="$(var.UpgradeCode)">

    <!-- Populate NEWERPRODUCTFOUND if there is an installed 
         package with the same upgrade code
         and version is > the version being installed -->
    <UpgradeVersion
         Minimum="$(var.CurrentVersion)"
         IncludeMinimum="no"
         OnlyDetect="yes"
         Language="1033"
         Property="NEWERPRODUCTFOUND" />

    <!-- Populate UPGRADEFOUND if there is an installed 
         package with the same upgrade code
         and the version is between the earliest version defined
         and the version being installed -->
    <UpgradeVersion
         Minimum="$(var.FirstVersion)"
         IncludeMinimum="yes"
         Maximum="$(var.CurrentVersion)"
         IncludeMaximum="no"
         Language="1033"
         Property="PREVIOUSVERSIONSINSTALLED" />
</Upgrade>

我在 MyProduct.wxs 中定义了以下内容

<?define CurrentVersion="5.0.0.18"?>
<?define FirstVersion="1.0.0.0"?>
<?define UpgradeCode="c1b1bfa0-9937-49eb-812c-5bac06eff858"?>

最后,我已将此添加到我的&lt;InstallExecuteSequence&gt;

<RemoveExistingProducts Before="InstallInitialize" />

但是当我将我的版本增加到 5.0.0.19 时它仍然没有删除旧版本。

也许我看错了,但在我的“添加/删除程序”窗口中,我看到我的设置列为 5.0.0.18,我看到第二个条目为 5.0.0.19

是否应该在每次更改版本时都更改升级代码?我以为我已经读过这不应该被改变。

有什么想法吗?

谢谢。

【问题讨论】:

  • 如果您知道所有可能的 UpgradeCodes 和 ProductVersions,您就不能制作自己的 Upgrade 元素来定位和升级它们吗? WiX MajorUpgrade 可能已经足够了,但如果还不够,您可以在升级元素中列出所有内容。
  • @PhilDW 感谢您的反馈。我会进一步调查。我以前从未进行过升级,我即将完成实际设置,所以我正处于收集信息阶段。

标签: wix windows-installer wix3.7


【解决方案1】:

这里是MajorUpgrade 元素的AllowSameVersionUpgrades 属性的文档。它包含相关信息。重点是我的。

当设置为 no(默认值)时,安装具有相同 版本和升级代码(但不同的产品代码)是允许的,并且 微星将其视为两种产品。当设置为 yes 时,WiX 设置 msidbUpgradeAttributesVersionMaxInclusive 属性,告诉 MSI 将具有相同版本的产品视为重大升级。

这在两个产品版本仅在第四个不同时很有用 版本字段。 MSI 在比较时特别忽略了该字段 产品版本,因此只有第四个不同的两个产品 version 字段是相同的产品,需要将此属性设置为 yes 被检测到。

请注意,由于 MSI 忽略了第四个产品版本字段, 将此属性设置为 yes 还允许在第一个 三个产品版本字段相同。例如,产品 版本 1.0.0.1 将“升级” 1.0.0.2998,因为它们被视为 相同的版本(1.0.0)。这可能会重新引入严重的错误,因此 最安全的选择是更改前三个版本字段并省略 这个属性获取默认的no。

AllowDowngrades 也为“yes”时,该属性不能为“yes” -- AllowDowngrades 已经允许使用相同版本的两个产品 号码互相升级。

将此属性设置为yes 可能不是您想要的,因为根据第三段,5.0.0.18 版将被视为5.0.0.19 版的升级。将此属性设置为no,并使用第三个产品版本字段仅允许升级。

【讨论】:

    【解决方案2】:

    经过大量的谷歌搜索,我找到了答案! Windows Installer 没有考虑到我正在使用的版本的 4 号,即 5.0.0.18。

    它只查看生成版本号的前 3 组数字。一旦我将我的版本从 5.0.18.0 更改为 5.0.19.0,它立即与问题中发布的代码一起工作,它删除了以前的版本并在其上安装了新版本。

    请注意,我实际上已经删除了上面的代码并最终使用了 MajorUpgrade,因为这正是我所需要的:

    <MajorUpgrade
      AllowDowngrades="no"
      AllowSameVersionUpgrades="no"
      IgnoreRemoveFailure="no"
      DowngradeErrorMessage="loc.NewerVersionInstalled"
      Schedule="afterInstallInitialize"/>
    

    希望这对其他人有帮助!

    【讨论】:

    • 明确地说,您正在更改产品代码版本,对吗?
    猜你喜欢
    • 1970-01-01
    • 2014-06-03
    • 1970-01-01
    • 2010-10-13
    • 2016-05-21
    • 2014-08-11
    • 1970-01-01
    • 2019-12-13
    • 1970-01-01
    相关资源
    最近更新 更多