2013-07-04 7 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 метаданные, доступные для ключом1, key2 и Key3, и что item2 метаданные, доступные для КЛЮЧ4, не зная, что имена этих ключей на самом деле.

Фактически, я пытаюсь использовать метаданные для указания атрибутов, о которых я понятия не имею, а затем попытаюсь выяснить способ проверки, чтобы определить, какие атрибуты были указаны.

Положите другой способ, я считаю, что метаданные каждого элемента - это просто хэш, содержащий пары ключ/значение, и я пытаюсь выяснить, что все ключи.

Кто-нибудь знает, как это сделать с помощью msbuild?

Благодаря

+2

Насколько я знаю, нет возможности перечислить метаданные элемента в MSBuild, но вы можете написать настраиваемую BuildTask, итерации по отраженным метаданным и можете ее перечислить. – MikeR

+0

Yup, это был маршрут, в который я попал –

ответ

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 автоматически добавляет к каждому элементу в itemgroup (например, FullPath, RootDir, Filename и т. д.). В моей реализации я добавил дополнительную проверку, чтобы игнорировать те элементы метаданных, которые я не забочусь о

Пример использования:

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

Чтобы увидеть вывод сообщения в окне вывода Visual Studio, вы, возможно, потребуется change your MSBuild output verbosity к по крайней мере, Normal.

+0

Спасибо, удивительный скрипт! –

+2

Не могли бы вы показать небольшой пример того, как использовать эту задачу? – Ivan

+1

Спасибо, это действительно полезно! Я добавил пример кода для его вызова. – EM0