如何将动态属性传递给MSbuild任务?

时间:2017-09-14 18:34:50

标签: automation msbuild

是否可以将动态属性组传递给MSbuild任务?所以,如果我有以下属性和值:

<MyPropertyGroup>
   <Foo>bar</Foo>
   <Foo1>bar1</Foo1>
   <Foo2>bar2</Foo2>
</MyPropertyGroup>

我可以使用短的属性列表调用MSBuild:

<MSBuild Projects="$(SolutionFile)" Targets="Build" Properties="MyPropertyGroup" />

但这与调用这样的任务是一样的:

<MSBuild Projects="$(SolutionFile)" Targets="Build" Properties="Foo=bar;Foo1=bar1;Foo2=bar2" />

如果有大型属性列表,则此选项很有用,并且只允许维护1个位置。

1 个答案:

答案 0 :(得分:1)

这里有两个问题:

  • 属性未分组,任何<PropertyGroup>元素仅用于定义属性。评估之后,所有属性都只是一个没有任何分组的键值对列表,所以即使<PropertyGroup Label="my groups">也不会影响它所包含的属性。
  • 项目可用于向同一“密钥”(项目标识)添加更多元数据值。但是,迭代自定义元数据只能在msbuild任务(=&gt;代码)中完成,而不能直接在MSBuild中完成,需要自定义任务和构建逻辑(参见this question)。

您问题的最实用的解决方案是定义包含所有值的单个属性:

<PropertyGroup>
  <BuildParameters>
    Configuration=Debug;
    Platform=Any CPU;
    SomeOtherProperty=Foo
  </BuildParameters>
</PropertyGroup>
…
<PropertyGroup>
  <!-- this property can even be extended afterwards, e.g. when a condition is needed -->
  <BuildParameters Condition=" '$(ShallAppendThings)' == 'true' ">
    $(BuildParameters);
    AnotherProperty=SomeValue
  </BuildParameters>
</PropertyGroup>
…

<MSBuild Projects="$(SolutionFile)" Targets="Build" Properties="$(BuildProperties)" />