这与这个问题相关。
回顾一下:
我有一个 WiX 4 捆绑包,它安装了多个 MSI(也是使用 WiX 4 编写的),我们将它们命名为 MsiA、MsiB 和 MsiC。所有组件都在我的控制之下。所有 MSI 中的更新均被编写为
MajorUpgrade
和 Schedule="afterInstallInitialize"
。
这个顺序也反映在我的包的 Chain 元素中。所有服务均使用
ServiceInstall
、ServiceDependency
和 ServiceControl
元素进行配置。
现在,如果我升级捆绑包,并且 MsiB 失败,则会发生回滚,这是所期望的。 但在这个过程中,会发生以下情况:
由于在这种情况下显然没有内置方法来启动 MsiBService(请参阅上面的问题),因此我编写了自己的自定义操作来在 MsiA 中执行此操作。
剩下的问题:条件调度。
如何检测(在引导程序或 MsiA 中)我正在运行“在回滚的情况下从上一个捆绑包开始重新安装”?
目前我有...
<Custom Action="Tools.ExecuteServiceCommand"
After="StartServices"
Condition="WIX_UPGRADE_DETECTED" />
...但是这个条件显然不行。
由于没有人有想法,我在引导程序中提出了以下条件:
var engineNumericVariables = bootstrapper.Engine.NumericVariables;
engineNumericVariables["RelatedBundleRollbackReinstallCalled"] =
saintBootstrapper.LaunchAction == LaunchAction.UpdateReplace &&
bootstrapper.Command.Action == LaunchAction.Install &&
bootstrapper.Command.Relation == RelationType.Upgrade
? 1
: 0;
此引擎变量的值将传递到受影响的 MSI 并在那里进行评估。
如果有人有更好的想法或发现错误,请随时发表评论。