我的MSBuild文件中有一个项目列表:
<ItemGroup>
<SubProject Include="**\*.csproj" />
</ItemGroup>
现在,我想在每个项目上为每个项目的元数据属性设置TargetPath
。
我已经知道如何为每个项目提取目标路径,并将其放在单独的项目列表中:
<Target Name="ExtractTargetPaths">
<MSBuild Projects="%(SubProject.Identity)" Targets="GetTargetPath">
<Output TaskParameter="TargetOutputs" ItemName="SubProjectTargetPath" />
</MSBuild>
</Target>
但是,我希望能够将“SubProjectTargetPath”作为SubProject
项目的元数据进行访问,而不是单独列出项目。
也就是说,而不是写例如这样:
<SomeTask Parameter="%(SubProjectTargetPath.Identity)" />
我可以这样写:
<SomeTask Parameter="%(SubProject.TargetPath)" />
答案 0 :(得分:5)
好的,我找到了一个解决方案,即使用目标批处理,使用临时属性:
<ItemGroup>
<SubProject Include="**\*.csproj" />
</ItemGroup>
<Target Name="UpdateSubProjectMetadata" Outputs="%(SubProject.Identity)">
<!-- Retrieves the Target DLL path and puts it in the temporary property "_TempTargetPath" -->
<MSBuild Projects="%(SubProject.Identity)" Targets="GetTargetPath">
<Output TaskParameter="TargetOutputs" PropertyName="_TempTargetPath" />
</MSBuild>
<!-- Set the metadata item for TestProject to the value of the temporary property -->
<ItemGroup>
<SubProject Condition="'%(SubProject.Identity)' == '%(Identity)'" >
<TargetPath>$(_TempTargetPath)</TargetPath>
</SubProject>
</ItemGroup>
<!-- Clear the temporary property -->
<PropertyGroup>
<_TempTargetPath></_TempTargetPath>
</PropertyGroup>
</Target>
一旦该目标运行,TargetPath就可用于每个元数据项。
实施说明:以上代码仅针对MSBuild 4.0进行了测试 - 我认为它在MSBuild 3.5上运行正常,以前版本的用户将使用<CreateItem>
和{{1而不是放置<CreateProperty>
和<PropertyGroup>
。