2013-07-04 8 views
6

特定のアイテムに関連付けられたすべてのメタデータキーを取得する方法はありますか?ItemGroupアイテムのすべてのメタデータキーを取得する方法は?

私は以下のようにしたいと思います。

を考える:

<ItemGroup> 
    <MyItems Include="item1"> 
     <key1>val1</key1> 
     <key2>val2</key2> 
     <key3>val3</key3> 
    </MyItems> 
    <MyItems Include="item2"> 
     <key4>val4</key4> 
    </MyItems> 
    </ItemGroup> 

はITEM1がKEY1、KEY2、およびKEY3のために利用可能なメタデータを持っていることを決定することができる、とITEM2ことをこれらのキーの名前が実際にあるか知らなくても、KEY4のために使用可能なメタデータを持っています。

実際、メタデータを使用して、わからない属性を指定し、次にどの属性が指定されているかを確認する方法を見つけようとしています。

他の言い方をすれば、各アイテムのメタデータはキー/値ペアを含むハッシュだけであり、すべてのキーが何であるか把握しようとしていると思います。

誰でもmsbuildでこれを行う方法を知っていますか?上記はまた、MSBuildのは自動的にすべての項目を追加し、すべてのデフォルトのメタデータが含まれることを

<UsingTask 
    TaskName="GetMetadataTask" 
    TaskFactory="CodeTaskFactory" 
    AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll" > 
    <ParameterGroup> 
    <MyItemGroup ParameterType="Microsoft.Build.Framework.ITaskItem[]" Required="true" /> 
    <MetadataString Output="true" /> 
    </ParameterGroup> 
    <Task> 
    <Using Namespace="System"/> 
    <Code Type="Fragment" Language="cs"> 
     <![CDATA[ 
      StringBuilder command = new StringBuilder(); 
      foreach (ITaskItem item in MyItemGroup) 
      { 
       command.AppendFormat("ItemName={0}\r\n", item); 
       foreach (string parameter in item.MetadataNames) 
       { 
        command.AppendFormat(" {0}={1}\r\n", parameter, item.GetMetadata(parameter)); 
       } 
       command.AppendFormat("\r\n"); 
      } 
      MetadataString = command.ToString(); 
     ]]> 
    </Code> 
    </Task> 
</UsingTask> 

注:私は次のようなカスタムインラインタスクを使用して、これを解決することになった

おかげ

+2

私が知る限り、MSBuildのアイテムのメタデータをリストするオプションはありませんが、反映されたメタデータを反復処理してリストするカスタムBuildTaskを記述することができます。 – MikeR

+0

うん、それは私が終わった道だった –

答えて

14

アイテムグループ(FullPath、RootDir、Filenameなど)私の実装では、私はおよそ

使用例気にしませんでしたこれらのメタデータ項目を無視するための追加のチェックを追加しました:

<GetMetadataTask MyItemGroup="@(YourItemGroup)"> 
    <Output TaskParameter="MetadataString" PropertyName="YourMetadataString"/> 
</GetMetadataTask> 
<Message Text="$(YourMetadataString)" /> 

は、Visual Studioの[出力]ウィンドウにメッセージ出力を表示するには、あなたはchange your MSBuild output verbosityにする必要があるかもしれません少なくとも正常。

+0

ありがとう、素晴らしいスクリプト! –

+2

このタスクの使い方の小さな例を示してください。 – Ivan

+1

ありがとう、本当に助かりました!私はそれを呼び出すためのサンプルコードを追加しました。 – EM0

関連する問題