如何在安装新版本的 Wix 安装程序之前强制完全卸载?

时间:2021-02-04 06:59:04

标签: .net wix setup-project

我们有一个 wix 设置,到目前为止运行良好。 最近我们从 Jenkins 从 Azure Devops 迁移到我们的 CI,有些事情发生了一点点变化(混淆,...)。但是整个 wix 解决方案并没有太大变化(我们有了新功能,所以我们确实添加了一些组件)。

在进行测试时,我们注意到在 jenkins 生成的先前版本(5.1.0)之上安装我们的新版本(5.1.2.x),我们安装了所有内容,没有错误,只有一个设置,但在安装文件夹中,我们在设置中包含的一些 DLL(似乎总是相同的)丢失了(显然,我们无法正常运行我们的应用程序)。

我们这样声明产品:

  <Product Id="*"
           Codepage="1252"
           Language="1033"
           Manufacturer="$(var.MANUFACTURER)"
           Name="$(var.PRODUCTNAME)"
           UpgradeCode="705E9C74-7192-4F74-B7A4-4DE9428B6FFA"
           Version="$(var.ProductVersion)">

我们将其作为升级:

<MajorUpgrade Schedule="afterInstallValidate" DowngradeErrorMessage="!(loc.DOWNGRADE_ERROR_MESSAGE)" />
<Upgrade Id="705E9C74-7192-4F74-B7A4-4DE9428B6FFA">
  <!--This is necessary to allow upgrading daily builds which will have all the same version but different product id 
    Ignore the ICE warning on compilation for this issue (the warning can be suppressed too)-->
  <UpgradeVersion Property="INSTALLED_PRODUCT_CODES" IncludeMinimum="yes" Minimum="2.12.7" IncludeMaximum="yes" Maximum="$(var.ProductVersion)"/>
</Upgrade>

我们目前确认的内容:

  • 手动卸载 5.1.0 并安装 5.1.2 工作
  • 仅安装 5.1.2 即可
  • 在 5.1.0 上安装 5.1.2 会删除一些文件

我尝试在 MajorUpgrade 步骤移动 afterInstallFinalize,它要求先卸载 5.1.0 并再次启动。 但是,卸载失败。就我所见,我认为 5.1.2 设置已经复制了一些新文件?

所以我的问题:

  • 如何在从新版本安装任何东西之前强制完全卸载
  • 有没有办法说只有转到 <=5.1.0 的版本才需要完全卸载?

2 个答案:

答案 0 :(得分:0)

我不知道为什么,但是将它添加到我的 Product.wxs 中解决了它:

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

它基本上告诉 wix 安装 DLL,无论它们被认为是旧的还是新的。

可以在此处找到有关重新安装模式的更多信息:https://docs.microsoft.com/en-us/windows/win32/msi/reinstallmode

默认值为 omus,这意味着“如果文件丢失或版本较旧,则重新安装。”

不知道为什么我的 DLL 不被视为“丢失或较旧”,但在设置后无处可寻。

答案 1 :(得分:0)

Microsoft DocsWhy Windows Installer removes files during a major upgrade if they go backwards in version numbers


这是一个常见问题,由一些不同的原因引起。通常:

  1. 降级版本文件。这可能会导致更新后文件丢失,因为文件扫描(成本计算)记录永远不应降级文件(但升级过程仍会删除旧文件,而不会安装新文件——这是一个相当大的错误)。

  2. 不同安装版本的组件 GUID 不一致。 On component reference counting。这也可能导致更新后文件丢失,但原因不同:新设置不知道该文件与以前相同 - 只是它的新版本 - 因为它在表单中有一个“新身份”一个新的 GUID - 因此它被错误地删除。一个“身份错误”的案例。

由于您的 tweak to REINSTALLMODE 有效(请浏览该链接),这可能是第一个问题。无论版本如何,此调整都会覆盖文件 - 这通常不是一个好主意。 You can check this answer for information and the suggestion to use companion files to solve the problem

问题 1 的修复包括 1) 使用组件文件,2) 破解受影响文件中更高的版本号,{{ 1}} 一些人尝试在 CostFinalize 之前移动 RemoveExistingFiles,但这并不真正起作用,并且文档无效,并且3) 他们称之为“版本谎言” - 为 MSI 中的文件设置一个假版本(在 InstallShield 中使用)。还有 4) Modify REINSTALLMODE - 和 this is bad“几个问题”部分),因为它会影响整个设置并可能覆盖共享文件并创建不一致的文件版本(一些文件已更新,一些文件因设置干扰而降级)。 5) 您还可以使用新名称或其他位置安装该文件。然后您应该更改组件 GUID(here is why - 组件 GUID 引用计数一个绝对路径 - 如果文件移动,GUID 不会跟随文件 - 使用新的 GUID 它具有“新身份”)。

问题 2 的修复方法是保持组件 GUID 跨版本一致,或者在 6) 早期移动标准操作 RemoveExistingProducts > 因此在安装新产品之前完全卸载整个产品。它有效地将设置与任何组件参考错误或任何其他过去的错误分离。干净的石板。

请参阅这些以前的答案:


链接: