如何在"循环中执行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。
答案 0 :(得分:1)
msbuild中的目标每次调用只执行一次。如果目标已经运行,则其他<CallTarget>
任务不会执行任何操作 - 与多个目标依赖共享目标时相同。
虽然可以通过定义元数据特定的Inputs
或Outputs
来使用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>
请注意,您还需要传递在构建期间生成/更改的任何其他属性,并且不属于项目文件的静态属性定义(即仅在目标内部设置)。