代码之家  ›  专栏  ›  技术社区  ›  mark

如何在命令行上用空值重写msbuild变量?

  •  1
  • mark  · 技术社区  · 7 年前

    请遵守以下简单的msbuild脚本 1.targets 以下内容:

    <?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 回复  |  直到 7 年前
        1
  •  1
  •   Michael Baker    7 年前

    你可以做 global properties 通过添加可变 TreatAsLocalProperty="x" 到根节点。

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

        2
  •  3
  •   Martin Ullrich    7 年前

    在命令行上指定属性时,它是 global property 以下内容:

    通过使用msbuild,可以在命令行上设置属性 /属性(或/P)开关。这些全局属性值重写 在项目文件中设置的属性值。这包括 环境属性,但不包括保留属性, 无法更改。

    如果需要将该值设置为默认值,则需要在目标内部对其进行更改,因为全局属性将覆盖“static”(目标外部)声明。

    <Target Name="PrintInfo">
      <PropertyGroup>
        <x Condition="'$(x)' == ''">hello</x>
      </PropertyGroup>
      <Message Text="x = $(x)" Importance="High" />
    </Target>