将MSBuild批处理任务输出添加为项元数据

时间:2012-07-04 11:24:19

标签: .net msbuild msbuild-task

我的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)" />

1 个答案:

答案 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>