回滚时检测重新安装

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

这与这个问题相关。

回顾一下:
我有一个 WiX 4 捆绑包,它安装了多个 MSI(也是使用 WiX 4 编写的),我们将它们命名为 MsiA、MsiB 和 MsiC。所有组件都在我的控制之下。所有 MSI 中的更新均被编写为

MajorUpgrade
Schedule="afterInstallInitialize"

  • MsiA 安装 Windows 服务 (MsiAService)。
  • MsiB 还安装了一个依赖于 MsiAService 的 Windows 服务 (MsiBService)。
  • MsiC 不包含服务。

这个顺序也反映在我的包的 Chain 元素中。所有服务均使用

ServiceInstall
ServiceDependency
ServiceControl
元素进行配置。

现在,如果我升级捆绑包,并且 MsiB 失败,则会发生回滚,这是所期望的。 但在这个过程中,会发生以下情况:

  • MsiB 回滚并启动它的 MsiBService。
  • 启动先前版本的捆绑包并重新安装 MsiA:它会停止其 MsiAService,并且由于 MsiBService 依赖于它,因此它也会被关闭。
  • 回滚后,它启动其MsiAService。
  • -> 问题: 依赖服务 MsiBService 保持停止状态。

由于在这种情况下显然没有内置方法来启动 MsiBService(请参阅上面的问题),因此我编写了自己的自定义操作来在 MsiA 中执行此操作。

剩下的问题:条件调度。

如何检测(在引导程序或 MsiA 中)我正在运行“在回滚的情况下从上一个捆绑包开始重新安装”?

目前我有...

<Custom Action="Tools.ExecuteServiceCommand"
        After="StartServices"
        Condition="WIX_UPGRADE_DETECTED" />

...但是这个条件显然不行。

wix
1个回答
0
投票

由于没有人有想法,我在引导程序中提出了以下条件:

var engineNumericVariables = bootstrapper.Engine.NumericVariables;
            
engineNumericVariables["RelatedBundleRollbackReinstallCalled"] =
                    saintBootstrapper.LaunchAction == LaunchAction.UpdateReplace &&
                    bootstrapper.Command.Action == LaunchAction.Install &&
                    bootstrapper.Command.Relation == RelationType.Upgrade
                        ? 1
                        : 0;

此引擎变量的值将传递到受影响的 MSI 并在那里进行评估。

如果有人有更好的想法或发现错误,请随时发表评论。

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