Wix Toolset如何在自定义动作的条件判断中使用var变量
你遇到的报错是因为预处理器变量$(var.SomeVar)会在编译阶段直接展开替换,你原来的写法没有给变量外层包裹双引号,当变量值为空时,展开后的条件会变成 = "",语法非法,所以light.exe抛出条件字符串错误。
注意:WiX的条件语法使用单等号
=做相等判断,不要使用双等号==,否则也会触发条件字符串错误。
方案1:编译期判断(打包时就确定是否触发自定义动作)
直接给预处理器变量外层包裹双引号即可,确保展开后永远是合法的条件表达式,不需要额外定义Property,符合你不想额外赋值给Property的需求:
<Custom Action="SomeCA">"$(var.SomeVar)" = ""</Custom>
如果需要用CDATA包裹,写法如下:
<Custom Action="SomeCA"><![CDATA["$(var.SomeVar)" = ""]]></Custom>
方案2:运行期判断(安装时动态判断是否触发自定义动作)
预处理器变量仅存在于编译打包阶段,安装包运行时无法识别$(var.xxx)语法,所以必须先将预处理器变量的值赋值给Property,再通过判断Property的值触发动作,这是WiX的标准实现方案,不存在冗余问题:
<!-- 编译时将预处理器变量值注入到Property --> <Property Id="SOME_VAR" Value="$(var.SomeVar)" /> <!-- 安装运行时判断Property值是否为空 --> <Custom Action="SomeCA">SOME_VAR = ""</Custom>
如果后续有多个位置需要用到这个变量,定义Property还能避免重复写$(var.SomeVar),更便于统一维护。
内容的提问来源于stack exchange,提问作者Alonzzo2
相关产品推荐
相关产品推荐

