请注意以下名为1.targets
的简短msbuild脚本:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="PrintInfo">
<PropertyGroup>
<x Condition="'$(x)' == ''">hello</x>
</PropertyGroup>
<Target Name="PrintInfo">
<Message Text="x = $(x)" Importance="High" />
</Target>
</Project>
现在我正在测试它:
C:\temp> msbuild .\1.targets /v:m /nologo
x = hello
C:\temp> msbuild .\1.targets /v:m /nologo /p:x=bye
x = bye
C:\temp> msbuild .\1.targets /v:m /nologo /p:x=""
x =
C:\temp> msbuild .\1.targets /v:m /nologo /p:x=
x =
C:\temp>
为什么传递空值不符合条件'$(x)' == ''
而不打印hello
?
答案 0 :(得分:3)
在命令行中指定属性时,它是global property:
MSBuild允许您使用命令行在命令行上设置属性 / property(或/ p)切换。这些全局属性值会覆盖 在项目文件中设置的属性值。这包括 环境属性,但不包括保留属性, 这是无法改变的。
如果需要将值设置为默认值,则需要在目标内部更改它,因为全局属性将覆盖“静态”(在目标之外)声明。
<Target Name="PrintInfo">
<PropertyGroup>
<x Condition="'$(x)' == ''">hello</x>
</PropertyGroup>
<Message Text="x = $(x)" Importance="High" />
</Target>
答案 1 :(得分:1)
您可以通过将TreatAsLocalProperty="x"
添加到根节点来使global properties变为可变。
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" TreatAsLocalProperty="x">
</Project>
msbuild C:\ Go.build / v:m / nologo / p:x =
将产生
x =你好