如何使用命令行中的空值覆盖msbuild变量?

时间:2018-06-10 02:07:07

标签: msbuild

请注意以下名为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

2 个答案:

答案 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 =你好