Как получить все ключи метаданных для любого элемента 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?

Спасибо

1 ответ

Решение

Я решил эту проблему с помощью встроенной задачи, подобной следующей:

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

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

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

Чтобы увидеть вывод сообщения в окне вывода Visual Studio, вам может потребоваться изменить выходную детализацию MSBuild по крайней мере на Normal.

Другие вопросы по тегам