Я реализовал свой первый MSI-установщик с помощью WIX-Toolset 3.6
, который включает настраиваемые действия для 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
я всегда создаю Backup-Directory со старой версией приложения (даже если установка прошла успешно). Когда мой CA_Install
сталкивается с исключением, установщик переходит к моему собственному пользовательскому действию отката CA_Rollback
. В этом пользовательском действии я удаляю все файлы в TARGETDIR
и воспроизводлю файлы из Backup-Directory. Он делает именно то, что должен делать, но после CA_Rollback
установщик Wix автоматически откатывает другие настраиваемые действия, такие как InstallFiles
. И поэтому он удаляет все файлы, которые воспроизводятся из Backup-Directory в моем CA_Rollback
ранее.
Можно ли отключить автоматический откат пользовательского действия InstallFiles
? Или есть другое решение моей проблемы?
Также странно, что ProgressText CA_Rollback — это не то, что я определил, а стандартный текст 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 НЕ является "Откатить приложение...", но в других пользовательских действиях (CA_SetTargetDir, CA_Backup, CA_Install) ProgressText отображается, как определено.
EDIT:
Я нашел Действие DisableRollback, и я хотел бы использовать его следующим образом в своем InstallExecuteSequence
:
<DisableRollback After="CA_Rollback" />
Поэтому я хотел бы запустить свой собственный откат CA_Rollback
, но хочу отключить автоматический откат других настраиваемых действий. Но когда включаю это, отката нет вообще.