如何筛选一个ItemGroup?

7
我正在尝试从另一个项目组创建筛选的项目组,其中筛选的项目组仅包含第一个组中具有指定文件扩展名的项目。
我得到以下错误:
error MSB4190:在此条件“'%(Extension)'=='.sys'”中不允许引用内置元数据“Extension”的位置1。
当我运行以下内容时:
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
         DefaultTargets="Go"
         ToolsVersion="4.0">

  <ItemGroup>
    <Files Include="X.exe"/>
    <Files Include="Y.sys"/>
  </ItemGroup>

  <ItemGroup>
    <SysFiles Include="%(Files.Identity)" Condition="'%(Extension)'=='.sys'">
    </SysFiles>
  </ItemGroup>

  <Target Name="Go">
    <Message Text="SysFiles=@(SysFiles)"/>
  </Target>

</Project>

首先,我不明白为什么元数据在此位置不允许?这是人为限制还是MSBuild未实现的部分?

其次,有没有简洁的方法来实现这种转换?

非常感谢。

1个回答

5

好的,我发现如果在目标Go中指定ItemGroup SysFiles,则不会出现错误。


哇,等一下伙计。这不是一个简单的修复,它不能以相同的方式工作。目标只能在实际构建期间执行。如果您正在尝试过滤影响IDE UI的项目组,则这很重要,因为它能够在目标/任务之外工作。请参见https://stackoverflow.com/questions/25177363/how-to-get-visual-studio-to-execute-msbuild-initialtargets-or-building-a-projec - marknuzz
1
如果这是您需要的行为,您可能需要向维护msbuild的团队提出问题单,因为它似乎不起作用。 - Scott Langham
我想在这里添加一条信息。请看这篇帖子:https://social.msdn.microsoft.com/Forums/en-US/109c2303-b4a5-4aa1-8f61-01663d358fa5/using-metadata-in-conditions,那里回答的人提到,在Target之外的PropertyGroup会在ItemGroup之前被评估。现在为什么Target之外的ItemGroup也不起作用,我不知道,但我也观察到将ItemGroup放在Target内会使其起作用。 - ohnezahn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接