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
相关产品推荐
相关产品推荐

