如何在MSBuild ItemGroups的“循环”中执行CallTarget任务?

时间:2017-11-13 16:15:43

标签: msbuild

如何在"循环中执行CallTarget任务"使用MSBuild ItemGroups?

我有一个以分号分隔值的属性,我想为每个值调用一次目标。

现在我已经检查过并且msbuild是自动分配到Itemgroup中的多个项目:

STRQMQRY QMQRY(library/qry-name) ALWQRYDFN(*YES) +
QMFORM(*QMQRY) SETVAR((COMPANY 1) (BRANCH 1) (ACCOUNT 12000)) 

我想要实现的是让其他目标被调用多次,因为这个ItemGroup中有值。 我知道我应该使用

<ItemGroup>
    <Version Include="$(Versions)" />
</ItemGroup>

但是,我没有在CallTarget Task上看到任何可能的属性。

不幸的是,我无法将我想要运行的目标迁移到C#或powershell。

1 个答案:

答案 0 :(得分:1)

msbuild中的目标每次调用只执行一次。如果目标已经运行,则其他<CallTarget>任务不会执行任何操作 - 与多个目标依赖共享目标时相同。

虽然可以通过定义元数据特定的InputsOutputs来使用target batching,但这并不适用于不代表磁盘上项目的项目。

使用不同输入执行相同逻辑的方法是使用<MSBuild>任务执行“内部”构建,该构建使用不同参数执行同一目标的多个构建:

<ItemGroup>
  <Version Include="1;2;3" />
</ItemGroup>
<MSBuild Projects="$(MSBuildProjectFile)" Targets="DoSthWithVersion" Properties="Version=%(Version.Identity)" />
…

<Target Name="DoSthWithVersion">
  <Message Importance="high" Text="Version is: $(Version)" />
</Target>

请注意,您还需要传递在构建期间生成/更改的任何其他属性,并且不属于项目文件的静态属性定义(即仅在目标内部设置)。