7

MSBuildファイルにプロジェクトのリストがあります。

<ItemGroup>
    <SubProject Include="**\*.csproj" />
</ItemGroup>

次に、各プロジェクトで、各プロジェクトTargetPathのメタデータプロパティに設定します。

各プロジェクトのターゲットパスを抽出し、それを個別のアイテムリストに配置する方法はすでに知っています。

<Target Name="ExtractTargetPaths">
    <MSBuild Projects="%(SubProject.Identity)" Targets="GetTargetPath">
        <Output TaskParameter="TargetOutputs" ItemName="SubProjectTargetPath" />
    </MSBuild>
</Target>

SubProjectただし、アイテムの個別のリストを作成するのではなく、アイテムのメタデータとしてその「SubProjectTargetPath」にアクセスできるようにしたいと思います。

つまり、たとえば次のように書く代わりに:

<SomeTask Parameter="%(SubProjectTargetPath.Identity)" />

私は次のようなものを書くことができるでしょう:

<SomeTask Parameter="%(SubProject.TargetPath)" />
4

1 に答える 1

7

OK、一時的なプロパティを持つターゲットバッチを使用するという1つの解決策を見つけました。

<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はすべてのメタデータアイテムで使用可能になります。

実装上の注意:上記のコードはMSBuild4.0でのみテストされています-MSBuild3.5でもそのまま機能すると思います。以前のバージョンのユーザーは、andを置く代わりにandタスクを使用<CreateItem><CreateProperty>ます。<PropertyGroup><ItemGroup>

于 2012-07-04T15:02:55.723 に答える