2013-07-04 48 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> 

能夠確定該物品1具有可用於KEY1,KEY2和KEY3的元數據,並且ITEM2具有可用於鍵4元,不知道什麼這些按鍵的名稱實際上是。

實際上,我試圖使用元數據來指定我不知道的屬性,然後嘗試找出一種方法來檢查以查看指定的屬性。換句話說,我相信每個項目的元數據只是一個包含鍵/值對的散列,我試圖弄清楚所有的鍵是什麼。

任何人都知道如何用msbuild做到這一點?

感謝

+2

據我所知,沒有選項可以在MSBuild中列出項目的元數據,但是您可以編寫一個自定義的BuildTask迭代反射的元數據並列出它。 – MikeR

+0

是的,那是我最終採取的路線 –

回答

14

我最終解決這一使用類似於以下的自定義內聯任務:

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

注意上面的還將包括所有的MSBuild自動添加到每個項目的默認元數據一個項目組(如FullPath,RootDir,文件名等)。我在執行我添加了一個額外的檢查,以忽略我不關心

樣品使用的元數據項:

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

要看到在Visual Studio中的輸出窗口消息輸出,您可能需要change your MSBuild output verbosity到至少正常。

+0

謝謝,真棒劇本! –

+2

請問您能否展示一個如何使用此任務的小例子? – Ivan

+1

謝謝,這真的很有幫助!我添加了調用它的示例代碼。 – EM0

相關問題