我有一个 WiX 4 捆绑包,它安装了多个 MSI(也是使用 WiX 4 编写的),我们将它们命名为 MsiA、MsiB 和 MsiC。所有组件都在我的控制之下。所有 MSI 中的更新均被编写为
MajorUpgrade
和 Schedule="afterInstallInitialize"
。
这个顺序也反映在我的包的
Chain
元素中。所有服务均使用 ServiceInstall
、ServiceDependency
和 ServiceControl
元素进行配置。
MsiA 的创作:
<ServiceInstall Id="S.MsiA.Service"
Name="MsiAService"
DisplayName="MSI A service"
Description="MSI A service"
Type="ownProcess"
Start="auto"
Account="LocalSystem"
ErrorControl="normal"
Vital="yes">
</ServiceInstall>
<ServiceControl Id="S.MsiA.Service"
Start="install"
Stop="both"
Remove="both"
Name="MsiAService"
Wait="yes" />
<util:ServiceConfig ServiceName="MsiAService"
FirstFailureActionType="none"
SecondFailureActionType="none"
ThirdFailureActionType="none" />
MsiB 的创作(具有服务依赖性):
<ServiceInstall Id="S.MsiB.Service" Name="MsiBService"
DisplayName="MSI B Service"
Description="MSI B Service"
Type="ownProcess" Start="auto" Account="LocalSystem"
ErrorControl="normal" Vital="yes">
<ServiceDependency Id="MsiAService"/>
</ServiceInstall>
<ServiceControl Id="S.MsiB.Service"
Start="install"
Stop="both"
Remove="both"
Name="MsiBService"
Wait="yes" />
<util:ServiceConfig ServiceName="MsiBService"
FirstFailureActionType="none"
SecondFailureActionType="none"
ThirdFailureActionType="none" />
现在,如果我升级捆绑包,并且 MsiB 失败,则会发生回滚,这是所期望的。
但在这个过程中,会发生以下情况:
我查找了 WiX 4 文档中的服务控制元素,但找不到此问题的解决方案。
另外在Google结果中我找不到解决方案。
我考虑过使用
CustomAction
来重新启动服务(通过“net start”),但我不知道如何制定此用例的条件以及我应该将其添加到哪个 MSI。
有人偶然发现这个问题吗?你是如何解决的?
或者WiX 4中有内置的解决方案吗?
您可以为您未安装的服务添加一个服务控制元素,如果找到,MSI 也会处理该问题。因此,如果您在安装程序 A 中为服务 B 编写 ServiceControl,它应该会为您提供您正在寻找的内容。