Msbuild 如何获取任何ItemGroup项的所有元数据键?
是否有方法获取与给定项关联的所有元数据键 我想做如下的事情 鉴于:Msbuild 如何获取任何ItemGroup项的所有元数据键?,msbuild,msbuild-4.0,itemgroup,Msbuild,Msbuild 4.0,Itemgroup,是否有方法获取与给定项关联的所有元数据键 我想做如下的事情 鉴于: <ItemGroup> <MyItems Include="item1"> <key1>val1</key1> <key2>val2</key2> <key3>val3</key3> </MyItems> <MyItems Include="item2"
<ItemGroup>
<MyItems Include="item1">
<key1>val1</key1>
<key2>val2</key2>
<key3>val3</key3>
</MyItems>
<MyItems Include="item2">
<key4>val4</key4>
</MyItems>
</ItemGroup>
瓦尔1
瓦尔2
val3
瓦尔4
能够确定item1具有可用于key1、key2和key3的元数据,item2具有可用于key4的元数据,而不知道这些键的实际名称
实际上,我正在尝试使用元数据来指定我不知道的属性,然后尝试找出一种方法来检查指定了哪些属性
换句话说,我相信每个项的元数据只是一个包含键/值对的散列,我正在尝试找出所有键是什么
有人知道如何使用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>
请注意,上面的内容还将包括MSBuild自动添加到itemgroup中每个项的所有默认元数据(如FullPath、RootDir、Filename等)。在我的实现中,我添加了一个额外的检查来忽略那些我不关心的元数据项
示例用法:
<GetMetadataTask MyItemGroup="@(YourItemGroup)">
<Output TaskParameter="MetadataString" PropertyName="YourMetadataString"/>
</GetMetadataTask>
<Message Text="$(YourMetadataString)" />
要在Visual Studio的“输出”窗口中查看消息输出,您可能至少需要将其设置为“正常”。据我所知,在MSBuild中没有列出项的元数据的选项,但您可以编写自定义的构建任务,该任务会迭代反射的元数据并将其列出。是的,这就是我最终选择的路线,谢谢!你能举一个小例子说明如何使用这个任务吗?谢谢,这真的很有帮助!我添加了调用它的示例代码。@EM,我找到了你的编辑,但被拒绝了(错误,IMO)。这里是为@EM试图提供帮助的人准备的:
dotnet core上不支持CodeTaskFactory,但通过做一些更改,这仍然适用于新版本:TaskFactory=“RoslynCodeTaskFactory”AssemblyFile=“$(MSBuildToolsPath)\Microsoft.Build.Tasks.core.dll”