如何在Wix Bundle的Log元素PathVariable属性中使用自定义变量?
问题根因
你遇到的问题由两个常见的Wix Bundle使用错误导致:
return (<Log>元素的`PathVariable`属性接收的是**变量的名称**,不需要用`[]`包裹变量名,你写`PathVariable="[LogLocation]"`时,引擎会尝试寻找名称为`[LogLocation]`的变量,自然无法匹配你定义的`LogLocation`变量。 )- Burn引擎的日志初始化时机早于自定义Bootstrapper Application(BA)的加载时机,如果你修改
LogLocation变量的时机太晚,引擎已经按照初始值创建了日志文件,后续的变量修改不会同步到已经初始化的日志配置中。
解决步骤
1. 修正Bundle代码配置
调整你的XML代码为以下写法:
<!-- PathVariable直接填变量名,不需要[],如果需要单独配置MSI日志路径可加MsiLogPathVariable属性 --> <Log PathVariable="LogLocation" MsiLogPathVariable="MsiLogLocation" /> <!-- 关闭Persisted避免旧安装的缓存值覆盖运行时设置,Overridable设为yes允许运行时修改 --> <Variable Name="LogLocation" bal:Overridable="yes" Type="string" Value="C:\myProjectDir\myLogs\bundle_log.txt" /> <Variable Name="MsiLogLocation" bal:Overridable="yes" Type="string" Value="C:\myProjectDir\myLogs\msi_log.txt" />
如果你不需要单独区分Bundle日志和MSI日志,只保留
PathVariable配置即可。
2. 调整C#代码的执行时机
要让变量修改生效,必须在自定义BA的入口逻辑最开头执行变量赋值,也就是在任何安装、检测逻辑触发前完成变量修改,此时引擎还未完全锁定日志路径,修改后的值会被日志模块读取。
代码示例:
protected override void Run() { // 第一行就修改日志路径变量 _bootstrapper.Engine.StringVariables["LogLocation"] = @"C:\ProjectGorilla\logs\bundle_log.txt"; _bootstrapper.Engine.StringVariables["MsiLogLocation"] = @"C:\ProjectGorilla\logs\msi_log.txt"; // 再执行其他初始化、界面渲染逻辑 // ... }
WixBundleLog用法说明
<WixVariable Id="WixBundleLog" Value="默认日志路径.txt" />是编译时设置Bundle默认日志路径的方式,优先级低于你运行时通过PathVariable关联的变量设置,如果你只需要固定默认路径不需要运行时修改,可以直接用这个配置,不需要额外定义Variable和Log元素的PathVariable属性。
内容的提问来源于stack exchange,提问作者Lelouch
相关产品推荐
相关产品推荐

