MSBuild过滤具有条件的文件组

时间:2017-09-01 11:39:19

标签: msbuild

这感觉就像它如此简单,但我无法让它发挥作用。

我试图实现的是嵌入式资源的过滤列表。我已经尝试了各种方法,但我似乎无法做到这一点。

我认为这是正确的解决方案:

<ItemGroup>
  <AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$(FullPath.Contains('Change')"/>
</ItemGroup>

编辑... 为了澄清,结果是没有条件的,列表是所有嵌入的资源,条件,组是空的。

我已经在目标内外尝试了这一点,并且我尝试在一个组中获取完整列表,然后在另一个组中进行过滤。我知道我只是误解了msbuild语法的一些基本部分,我似乎无法解决这个问题。期待出现我的愚蠢错误!

2 个答案:

答案 0 :(得分:3)

在目标内部,可以使用项目的批处理语法并使用System.String.Copy方法在字符串上调用实例函数来完成此操作:

<Target Name="ListAllEmbeddedResources">
  <ItemGroup>
    <AllEmbeddedResources Include="@(EmbeddedResource)" Condition="$([System.String]::Copy(%(FullPath)).Contains('Change'))" />
  </ItemGroup>
  <Message Importance="high" Text="AllEmbeddedResources: %(AllEmbeddedResources.Identity)" />
</Target>

请注意,此语法仅适用于目标,而不适用于静态评估(直接位于<Project>节点下的项目组)。

答案 1 :(得分:0)

Condition属性必须返回一个布尔值,并且它对itemgroup的每个元素进行操作。 您可以使用%(Identity)访问每个元素。 假设您有一个名为 UnfilteredItems 的未过滤项目组,并且希望使用某些正则表达式模式将它们过滤到一个名为 MyFilteredItems 的组中。

<ItemGroup>
  <MyFilteredItems Include="@(UnfilteredItems)" Condition="$([System.Text.RegularExpressions.Regex]::Match(%(Identity),'.*\\bin\\.*').Success)"/>
</ItemGroup>