【问题标题】:How to get all the metadata keys for any ItemGroup item?如何获取任何 ItemGroup 项目的所有元数据键?
【发布时间】:2013-07-04 02:56:50
【问题描述】:

有没有办法获取与给定项目关联的所有元数据键?

我想做如下的事情。

给定:

  <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 中没有列出项目元数据的选项,但您可以编写自定义 BuildTask 迭代反映的元数据并列出它。
  • 是的,这就是我最终选择的路线

标签: msbuild msbuild-4.0 itemgroup


【解决方案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、文件名等)。在我的实现中,我添加了一个额外的检查来忽略那些我不关心的元数据项

示例用法:

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

要在 Visual Studio 的“输出”窗口中查看消息输出,您可能需要至少将 change your MSBuild output verbosity 设置为正常。

【讨论】:

  • 谢谢,很棒的脚本!
  • 你能举个小例子来说明如何使用这个任务吗?
  • 谢谢,这真的很有帮助!我添加了调用它的示例代码。
  • @EM,我找到了您的编辑,但被拒绝(不正确,IMO)。这是给那些@EM 试图提供帮助的人:&lt;GetMetadataTask MyItemGroup="@(YourItemGroup)"&gt; &lt;Output TaskParameter="MetadataString" PropertyName="YourMetadataString"/&gt; &lt;/GetMetadataTask&gt;
  • dotnet 核心不支持 CodeTaskFactory,但通过进行一些更改,这仍然适用于新的 RoslynCodeTaskFactoryTaskFactory="RoslynCodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.Core.dll"
猜你喜欢
  • 2015-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2014-08-22
  • 1970-01-01
  • 2017-04-01
  • 1970-01-01
相关资源
最近更新 更多