禁用InstallFiles自动回滚

本文关键字:InstallFiles 禁用 | 更新日期: 2023-09-27 18:04:28

我已经使用WIX-Toolset 3.6实现了我的第一个MSI-Installer,其中包括Backup, InstallationRollback的自定义操作。

备份和安装工作正常,但我有一个问题,我的回滚自定义操作。我已经像这样定义了我的自定义动作:

<!-- Custom actions -->
<CustomAction Id="CA_Install" Return="check" BinaryKey="BIN_CaLibrary" Execute="deferred" DllEntry="CaInstall" />
<CustomAction Id="CA_Rollback" Return="check" BinaryKey="BIN_CaLibrary" Execute="rollback" DllEntry="CaRollback" />
<CustomAction Id="CA_Backup" Return="check" BinaryKey="BIN_CaLibrary" Execute="immediate" DllEntry="CaBackup" />
<CustomAction Id="CA_SetTargetDir" Return="check" BinaryKey="BIN_CaLibrary" Execute="immediate" DllEntry="CaSetTargetDir" />
<CustomAction Id="CA_SetTargetDirAndInstallTypeForInstall" Return="check" Property="CA_Install" Value="InstallType=[INSTALLTYPE];TargetDir=[TARGETDIR]" />
<CustomAction Id="CA_SetTargetDirForRollback" Return="check" Property="CA_Rollback" Value="TargetDir=[TARGETDIR]" />
<!-- Linking custom actions to the install sequence -->
<InstallExecuteSequence>
  <Custom Action="CA_SetTargetDir" Before="AppSearch" />
  <Custom Action="CA_Backup" After="CA_SetTargetDir" />
  <Custom Action="CA_SetTargetDirForRollback" Before="CA_Rollback" />
  <Custom Action="CA_SetTargetDirAndInstallTypeForInstall" Before="CA_Install"/>
  <Custom Action="CA_Rollback" Before="CA_Install"/>
  <Custom Action="CA_Install" Before="InstallFinalize" />
</InstallExecuteSequence>

在我的CA_Backup中,我总是用旧版本的应用程序创建一个备份目录(即使安装成功)。当我的CA_Install遇到异常时,安装程序跳转到我自己的回滚自定义操作CA_Rollback。在此自定义操作中,我删除TARGETDIR中的所有文件,并从Backup-Directory中复制文件。它做了它应该做的事情,但是在CA_Rollback之后,Wix-Installer自动回滚其他自定义操作,如InstallFiles。因此,它删除了以前在我的CA_Rollback备份目录中复制的所有文件。

是否可以禁用InstallFiles自定义动作的自动回滚?还是我的问题有别的解决办法?

CA_Rollback的ProgressText不是我定义的,而是WiX-Framework的标准文本,这也很奇怪。

<ProgressText Action="CA_SetTargetDir">Getting Installation-Type...</ProgressText>
<ProgressText Action="CA_Backup">Creating Backup-Directory...</ProgressText>
<ProgressText Action="CA_Install">Updating Application...</ProgressText>
<ProgressText Action="CA_Rollback">Rollback the Application...</ProgressText>

所以,当安装程序跳转到CA_Rollback时,ProgressText不是"Rollback the Application…",但在其他自定义操作(CA_SetTargetDir, CA_Backup, CA_Install)中,ProgressText显示为定义的。

编辑:


我已经找到了DisableRollback动作,我想在我的InstallExecuteSequence中这样使用它:

<DisableRollback After="CA_Rollback" />

所以我想运行我自己的回滚CA_Rollback,但想禁用其他自定义动作的自动回滚。但是当我包含这个时,根本没有Rollback

禁用InstallFiles自动回滚

你的问题对我来说有点不清楚-我很困惑你到底在问什么,以及为什么你以这种方式实现了回滚。然而,这里有一个一般的答案:

回滚支持是Windows Installer的内置功能,您根本不需要实现此功能。您可能需要一个回滚自定义操作来补充对目标系统进行更改的自定义操作。

在软件安装过程中替换的文件,以及注册表项,ini文件设置和MSI表中正确定义的其他设置,都在安装过程中直接存储在系统驱动器(通常为C:'Config.MSI)的隐藏文件夹中。这些文件的扩展名为。RBS。RBF - 回滚脚本文件 -如果在安装过程中发生错误,将系统恢复到以前的状态,禁止自定义操作中的任何更改。

自定义操作是特殊的,因为它们根据定义是非标准的,因此没有内置的回滚支持。为了回滚这些更改,您需要编写一个附加的回滚自定义操作来撤消原始自定义操作所做的操作。这可能非常复杂,需要仔细安排、实现和测试。请注意,执行检查、属性检索或其他任务而不进行任何系统更改的只读自定义操作不需要回滚。使用这些非侵入性的自定义操作可能非常有效。我特别喜欢使用这些自定义动作在一个脚本中收集许多操作,以便其他安装开发人员更容易检查。MSI的运行时行为就像一个复杂的手表——可能会有许多交互和计时问题,这使得它很难得到一个快速的概述。可能需要在2-3个不同的,看似不相关的地方做出改变,以获得你需要的行为。脚本是连续的,可以进行注释以更容易理解,关键是在单个位置进行更改。对于团队工作,我发现这些脚本是必不可少的。

必须指出的是,自定义操作往往是不必要的,因为使用内置的Windows Installer功能或WIX功能已经以更可靠的方式实现了相同的功能。 Wix是一个基于XML的工具包,允许从XML源文件编译MSI文件。该工具包是由Rob Mensching编写的,他曾经是微软Windows安装团队的一员,并且非常可靠,高度可定制,并且充满了高级和简单的功能。

如果可能的话,避免不必要的自定义操作的重要性怎么强调都不为过。检查Windows Installer或Wix是否支持。

MSI功能完全支持处理ini文件设置,字体,环境变量,注册表项,COM信息,快捷方式,文件扩展名,启动条件,GAC安装,ODBC等的合并…

WIX进一步支持非常高级的功能,如SQL服务器扩展,IIS安装和配置,性能计数器,DirectX检查和其他游戏相关任务,. net本机图像生成,COM+,驱动程序,防火墙规则,PowerShell扩展,应用程序关闭,用户,组,共享管理等等。处理起来有些复杂,但比您自己的自定义操作可靠得多。下载最新版本的WIX,并阅读帮助文件 WIX。chm - Wix Schema References部分