【问题标题】:MSBuild Filtering ItemGroup of files with conditionMSBuild过滤ItemGroup的文件与条件
【发布时间】:2018-02-10 11:23:06
【问题描述】:

这感觉很简单,但我无法让它工作。

我想要实现的只是嵌入资源的过滤列表。我尝试了各种方法,但似乎无法正确。

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

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

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

我在目标内部和外部都尝试过,我尝试在一个组中获取完整列表,然后在单独的组中进行过滤。我知道我只是误解了 msbuild 语法的一些基本部分,我似乎无法解决它。期待看到我的愚蠢错误!

【问题讨论】:

  • $ 用于引用属性。您想引用元数据,这是使用% 完成的,所以对于初学者,您应该%(FullPath...。但我 100% 确定之前有人问过这个问题,所以只需四处搜索。
  • @stijn 所以我也这么认为,但是如果我使用这种语法 [Condition="%(FullPath).Contains('Change')"] 我收到错误 [error MSB4092: An unexpected token “。”在条件 "%(FullPath).Contains('Change')" 中的字符位置 12 处发现。] 已经提出了类似的问题,但是无论我做什么来遵循他们的示例,它似乎都不够接近。我将进行编辑以包含指向我尝试过的内容的链接...
  • @Adam 您需要在静态评估(项目全局)期间还是在目标内部执行此操作?在静态评估期间很难做到..
  • @MartinUllrich 目的是将文件列表传递给一个任务,然后验证其他一些事情(如果有任何区别,请补充内联任务)。我已经在包含任务的目标之外以及在任务之前的目标内部尝试过它。两者似乎都不起作用。

标签: msbuild


【解决方案1】:

在目标内部,这可以使用项目的批处理语法并使用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>

请注意,此语法仅在目标内部有效,在静态评估期间无效(直接在 &lt;Project&gt; 节点下的项目组)。

【讨论】:

  • 完美运行!谢谢!很高兴我不只是愚蠢……对它如此晦涩感到失望!
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2012-10-12
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    • 2010-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多