问题:
MSBuild任务(不是MSBuild.exe,名为MSBuild的MSBuild任务)无法处理WIX项目使用的多个常量.通常,您可以在构建脚本中指定属性,如:
但是,在查看构建日志时,您看到的是MSBuild将常量分开,并且不会像您期望的那样将值组合在一起 - 类似于:
Task "MSBuild" Global Properties: Configuration=MyConfig Platform=x86 DefineConstants="SOMETHING=1 SOMETHINGELSE=2"
因此,当candle尝试使用这些常量时,它通常会响应"错误CNDL0150:未定义的预处理器变量'$(var.SOMETHINGELSE)'.这意味着MSBuild任务无法正确处理值中包含多个'='的属性当在引号内分组时.如果没有将属性值分组在引号中,它们显然应被视为单独的属性,而不是单个值.
解决方法:
为了解决此问题,您需要直接调用MSBuild.exe并手动将这些值传递给它.
msbuild.exe /p:Configuration=MyConfig /p:Platform=x86 /p:DefineConstants="SOMETHING=1;SOMETHINGELSE=2" YourSolution.sln
这将使您的常量按照您希望的方式工作,而无需重新设计您的WiX安装项目.
注意:如果您只使用一个常量,您仍然可以像这样使用MSBuild任务:
问题在于将名称 - 值对传递给MSBuild任务,然后使MSBuild正确解析它们,以便将它们传递给Candle任务.似乎MSBuild可以处理简单名称列表或单个名称 - 值对,但不能处理对列表.
我的解决方案是在传递到MSBuild任务时转义列表,并在转到Candle任务时再次取消它.
在MSBuild文件中,在属性中定义对,如下所示:
One=1; Two=2; Three=3;
当您调用MSBuild任务时,请转义该属性(需要MSBuild 4):
unescaping必须在wixproj文件中完成,但不需要手动编辑文件.只需打开项目的属性,转到Build选项卡,并在其中显示"Define preprocessor variables",放置:
$([MSBuild]::Unescape($(WixValues)))
即使该框中已有其他变量,这也有效; 只需将其与分号一起添加到列表中即可.
您将在MSBuild日志中看到该candle.exe
工具正确接收参数:
candle.exe -dOne=1 -dTwo=2 -dThree=3 -dConfiguration=Release...