You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Wix Burn工具:非关键包安装失败后继续安装并显示错误的实现方法

搞定Wix Bundle单包失败仍继续安装并最终提示错误的方案

嘿,这个需求其实在Wix Bundle里是可以通过几个关键配置和自定义动作实现的,我来给你拆解一下具体步骤:

1. 先让Bundle允许单个包失败后继续跑

首先,你需要在Bundle的<Chain>节点里,给那个允许失败的App2包加上Vital="no"属性。这个属性的作用就是告诉Wix:哪怕这个包装砸了,也别立刻终止整个安装流程,接着装剩下的包就行。

示例代码看起来是这样的:

<Chain>
  <PackageGroupRef Id="App1Package" />
  <!-- 给App2加上Vital="no",允许失败继续 -->
  <MsiPackage SourceFile="path/to/App2.msi" Vital="no" Id="App2Package" />
  <PackageGroupRef Id="App3Package" />
  <!-- 其他需要安装的包... -->
</Chain>

2. 把App2的失败信息存下来

光让流程继续还不够,你得把App2的错误信息记录下来,不然最后没法提示用户。这里分两种情况,如果你用的是默认的Bootstrapper Application(BA),可以用变量+自定义动作来捕获错误;如果是自定义BA,那就更灵活了。

用默认BA的话这么做:

先在Bundle里定义一个变量用来存错误代码:

<Variable Name="App2InstallError" Type="numeric" Value="0" />

然后给App2的MsiPackage加个OnExit属性,指定一个自定义动作来抓退出代码:

<MsiPackage SourceFile="path/to/App2.msi" Vital="no" Id="App2Package" OnExit="App2ExitHandler" />

接着写那个自定义动作,把错误代码存入变量:

<CustomAction Id="App2ExitHandler" Return="check" Execute="immediate" Script="vbscript">
  <![CDATA[
    Dim exitCode
    exitCode = Session.Property("WIX_EXITCODE")
    ' 如果退出代码不是0,说明安装失败,把代码存起来
    If exitCode <> 0 Then
      Session.Property("App2InstallError") = exitCode
    End If
  ]]>
</CustomAction>

3. 安装结束时弹出错误提示

现在错误信息存好了,接下来要在所有安装步骤都跑完后,把这个错误提示给用户看。

如果是自定义BA,你可以在Bundle完成所有安装后,检查App2InstallError变量的值,要是不为0,就弹出个提示框告诉用户App2装失败了,甚至可以显示具体的错误代码。

如果用默认BA,那就加个自定义动作在安装最后执行弹窗:

<CustomAction Id="ShowApp2Error" Return="ignore" Execute="commit" Script="vbscript">
  <![CDATA[
    Dim errorCode
    errorCode = Session.Property("App2InstallError")
    If errorCode <> 0 Then
      MsgBox("App2安装失败,错误代码:" & errorCode, vbCritical, "安装提示")
    End If
  ]]>
</CustomAction>

<!-- 配置这个动作在安装完成后执行,只有当App2确实失败时才触发 -->
<InstallExecuteSequence>
  <Custom Action="ShowApp2Error" After="InstallFinalize">App2InstallError <> 0</Custom>
</InstallExecuteSequence>

几个要注意的点

  • 加了Vital="no"后,默认BA会把整个Bundle的安装结果标记为成功,所以必须手动加提示,不然用户根本不知道App2装失败了。
  • 如果App2安装失败后需要回滚,得额外配置回滚逻辑,Vital="no"可能会影响默认的回滚行为,要确保其他包的状态不受影响。
  • 自定义BA的方式自由度更高,能完全控制UI和错误展示,适合复杂的安装场景。

内容的提问来源于stack exchange,提问作者Raghavendra Prasad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:02:43