4

デフォルトのMSBuildテクノロジを使用して、msbuildのプロパティとしてアイテムグループ内のリストにアクセスすることは可能ですか?これはC#のカスタムタスクで実行できることはわかっていますが、可能であれば組み込み機能を使用しようとしています。

例:

私はアイテムグループを持っています:

<ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\Solutions\ClassLib\ClassLib.sln">
      <Properties>
        AssemblySigningKey=MySigningKey;
        OutDir=$(BinariesRoot)\SomeLocation\;
        LibraryName=ClassLib;
        PlatformTarget=x86;
      </Properties>
    </SolutionToBuild>

    <SolutionToBuild Include="$(SolutionRoot)\Solutions\BLAH\BLAH.sln">
      <Properties>
        ProjectType=Web;
      </Properties>
    </SolutionToBuild>
</ItemGroup>

AssemblySigningKeyの値が存在する場合はそれを抽出し、この値をMSBuild変数に配置したいと思います。

私はいくつかの方法を試しましたが、私が見つけた最も近い例は、別のターゲット内で変換を使用することですが、これでも少しハックのように見えますが、Condition動作させることができたとしても、解析する必要がありますの値の分割=。アイテムグループ内でこのメタデータにアクセスするための標準的な方法はありませんか?

<Target Name="TransformProps"
        Inputs="%(SolutionToBuild.Identity)"
        Outputs="_Non_Existent_Item_To_Batch_">

    <PropertyGroup>
        <IncludeProps>%(SolutionToBuild.Properties)</IncludeProps>
    </PropertyGroup>

    <ItemGroup>
        <IncludeProps Include="$(IncludeProps)" />
        <Solution Include="@(SolutionToBuild)">
          <IncludeProps Condition="'True'=='True' ">@(IncludeProps ->'-PROP %(Identity)', ' ')</IncludeProps>

        </Solution>
    </ItemGroup>
</Target>

私の主なターゲットは、次の方法でトランスフォームを呼び出します。

<Target Name="Main"  DependsOnTargets="TransformProps">    
    <Message Text="Solution info:  %(Solution.Identity) %(Solution.IncludeProps)" />
</Target>
4

1 に答える 1

2

アイテムのメタデータは、xml タグを使用して宣言および変換されます。MSBuild タスクを使用していくつかのソリューションを構築しているようです。プロパティタグは、このタスクに固有のパラメーターです。

あなたが述べたように、キーから値へのリンクとして等号がまだ残っているため、カンマ区切りのリストとアイテムからの変換は役に立ちません。解析せずに署名キーの値を取得する方法はないと思います。結局、msbuild はプロパティのリストをメタデータとは見なさず、単なる文字列のリストです。

msbuild がメタデータを宣言して読み取る方法を例示するために、以下のスクリプトを実行しました。ItemGroup 構造を変更できないため、これはオプションではありません。

この場合、私見ではオプションはありませんが、カスタムタスクを使用して解析を行います。msbuild 4.0 でビルドしている場合は、インライン タスクを使用します。

<?xml version="1.0" encoding="UTF-8" ?>
<Project DefaultTargets="Main" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemGroup>
    <SolutionToBuild Include="$(SolutionRoot)\Solutions\ClassLib\ClassLib.sln">
      <AssemblySigningKey>MySigningKey123</AssemblySigningKey>
      <Properties>
        AssemblySigningKey=MySigningKey456;
        OutDir=$(BinariesRoot)\SomeLocation\;
        LibraryName=ClassLib;
        PlatformTarget=x86;
      </Properties>
    </SolutionToBuild>
  </ItemGroup>

  <Target Name="TransformProps">
    <PropertyGroup>
      <MySigningKey>@(SolutionToBuild->'%(AssemblySigningKey)')</MySigningKey>
    </PropertyGroup>
  </Target>

  <Target Name="Main"  DependsOnTargets="TransformProps">
    <Message Text="My desired Property Value:  $(MySigningKey)" />
  </Target>
于 2013-03-06T16:49:36.460 に答える