我已使用WIX-Toolset 3.6
实施了我的第一个MSI-Installer,其中包括Backup
,Installation
和Rollback
的自定义操作。
备份和安装工作正常,但我的回滚自定义操作有问题。我已经定义了我的自定义操作:
<!-- 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
中的所有文件,并从备份目录中重现这些文件。它正是它应该做的,但在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不是&#34;回滚应用程序...&#34; 但是在其他自定义操作中(CA_SetTargetDir,CA_Backup,CA_Install) ProgressText显示为已定义。
编辑:
我找到了DisableRollback Action,我想在我的InstallExecuteSequence
中这样使用它:
<DisableRollback After="CA_Rollback" />
所以我想运行自己的Rollback CA_Rollback
,但想要禁用其他自定义操作的自动回滚。但是当我包含它时,根本没有回滚。
答案 0 :(得分:4)
你的问题对我来说有点不清楚 - 我对你真正要问的问题感到很困惑,以及为什么你用这种方式实现了回滚。但是,这是一般答案:
回滚支持是Windows Installer的内置功能,您根本不需要实现此功能。您可能需要的是回滚自定义操作,以补充对目标系统进行更改的自定义操作。请参阅以下信息。
在安装软件期间更换的文件,以及注册表项,ini文件设置和MSI表中正确定义的其他设置都直接存储在系统驱动器上的隐藏文件夹中(通常 C :\ Config.MSI )安装期间。这些文件的扩展名为 .RBS 和 .RBF - 回滚脚本文件 - 如果在安装过程中发生错误,系统会恢复到之前的状态,禁止在自定义操作中进行任何更改。
自定义操作在某种意义上是特殊的,因为它们按照定义是非标准的,因此它们的回滚没有内置支持。为了回滚这些更改,您需要编写一个免费的回滚自定义操作来撤消原始自定义操作的操作。这可能非常复杂,需要仔细调度,实施和测试。请注意,执行检查,属性检索或其他任务而不进行任何系统更改的只读自定义操作不需要回滚。使用这些非侵入式自定义操作可能非常有效。我特别喜欢使用这些自定义操作在一个脚本中收集许多操作,以便其他安装程序开发人员更容易检查。 MSI的运行时行为就像一个复杂的手表 - 许多交互和计时问题都是可能的,这使得很难快速了解。可能需要在2-3个不同的,看似无关的地方进行更改,以获得所需的行为。脚本是顺序的,可以进行评论以便于理解,并在一个位置进行重要更改。对于团队合作,我发现这些脚本非常重要。
必须指出自定义操作往往是不必要的,因为已经使用内置的Windows Installer功能或WIX功能以更可靠的方式实现了相同的功能。 {{ 3}}允许从XML源文件编译MSI文件。该工具包由Rob Mensching编写,他是微软Windows安装团队的成员之一,具有高可靠性,高度可定制性,并且具有高级和简单的功能。
尽可能避免不必要的自定义操作的重要性,不能过分夸大。检查Windows Installer或Wix是否支持它。
MSI 完全支持处理合并ini文件设置,字体,环境变量,注册表项,COM信息,快捷方式,文件扩展名,启动条件,GAC安装,ODBC等...
WIX 进一步支持非常高级的功能,例如SQL服务器扩展,IIS安装和配置,性能计数器,DirectX检查和其他游戏相关任务,.NET本机映像生成,COM +,驱动程序,防火墙规则,PowerShell扩展,应用程序关闭,用户管理,组,共享等等。有点涉及处理,但比你自己的自定义操作更可靠。下载Wix is an XML based toolkit并阅读帮助文件 Wix.chm - Wix Schema References部分。