如何使用 WixSharp 配置或取消删除文件?

问题描述 投票:0回答:1

我所在的新团队继承了跨平台应用程序,以及适用于 Windows、Mac 和 Linux 的安装程序。

该应用程序是一个静默后台代理,负责应用您友好的 IT 团队在我们的 Web 后端指定的补丁和其他配置,如果安装失败,IT 人员将失去对计算机的控制,必须手动重新安装我们的软件。失败的可能性相对较小,但失败的原因有多种,例如如果用户在我们安装升级过程中选择重新启动(更不用说断电和其他此类故障)。我们在现场管理着足够多的设备,这绝对是我们需要定期应对的问题。鉴于我们软件的全部目的是消除手动干预的需要,当我们的客户必须手动干预才能修复我们的应用程序时,它并不会受到欢迎。

Windows 安装程序是使用 WixSharp 1.9.3 (WiX 3) 在 .NET 4.5.1 上构建的 MSI。一般来说,我对 Windows 平台和 .NET 的开发知之甚少,更不用说安装程序 API、WiX 或 WixSharp 的任何细节了,所以我可能会遗漏一些相当明显的东西,但我一直在深入研究文档对于以上所有内容已经有一个多星期了,虽然我学到了很多东西,但到目前为止我还无法弄清楚这一点。

从我的安装程序日志中可以看出,RemoveFiles 操作在安装过程的早期运行,它会在安装新应用程序之前删除我的应用程序之前安装的任何内容。因此,有一段时间我们的应用程序没有安装任何版本。这对恢复能力不利!

我们将现有的二进制文件称为

agent.exe
。为了最大限度地提高可恢复性,在不知道此删除文件步骤的情况下,我们修改了安装程序,以便:

  1. 将新的二进制文件安装为
    agent-{newVersion}.exe
  2. 在安装后脚本中:
    1. 针对
      agent-{newVersion}.exe
      执行一些兼容性和功能测试。如果这些测试失败则中止。
    2. 将现有
      agent.exe
      复制为
      agent-{oldVersion}.exe
    3. agent-{newVersion}.exe
      复制到
      agent.exe
      (覆盖旧的)

当然,有些安装是全新安装而不是升级,因此所有安装后步骤都必须容忍旧文件丢失 - 这导致看起来一切正常,即使旧文件始终失踪了。

测试时,我们在步骤1中引入了延迟,然后在延迟期间强制测试机重新启动。当机器恢复时,安装被“挂起”并且没有

agent.exe
,因此我们的服务无法启动,即没有代理在运行。通过重新运行安装程序可以轻松解决此问题 - 但这需要手动干预。

那么,如何配置 MSI 安装程序,使其在写入新二进制文件之前不会删除旧二进制文件?我可以完全禁止删除文件并将其替换为自定义操作吗?我可以将RemoveFiles 本身配置为不同的行为吗? (或者我在这整件事上都错了?)

请注意,我仍然需要在卸载过程中运行RemoveFiles(或自定义替换),在这种情况下,我需要它来删除

agent.exe
以及任何
agent-{version}.exe
副本。

windows-installer wixsharp
1个回答
0
投票

您正在谈论升级。在 WiX 中,这是由 MajorUpgrade 元素 控制的。当主要升级是

Scheduled
时,您可以控制,并且根据您所写的内容,您可能需要考虑
afterInstallExecute
。该文档详细解释了这些选项。

Windows Installer 中没有内置任何内容可以替换您所描述的文件。如果您确实想要类似的模式,我建议安装到版本化文件夹中。

PS:我不知道WixSharp语法。对我来说不是一个有价值的抽象。

© www.soinside.com 2019 - 2024. All rights reserved.