以下内容似乎是gradle中用于过滤资源文件子集的常用习惯用法。我理解它的作用,但我无法破译语法:
processResources {
filesMatching('foo/*.html') {
filter(ReplaceTokens, tokens: [key: 'value'])
}
}
我明白这一点:
我正在通过调用以下方法来配置processResources任务:
AbstractCopyTask filesMatching(String pattern, Action<? super FileCopyDetails> action)
该方法的第一个参数是模式字符串。我提供'foo / * .html'作为模式。
Action
接口,它只有一个方法。我提供了一个闭包作为接口的实现。这是我迷失的地方。在闭包体中,我正在调用filter方法。它从何而来?它也不是来自隐式项目对象。并且,过滤方法甚至不应用于任何文件对象。如何替换令牌?并且,ReplaceTokens
是一个类,如何将类名称作为参数在语法上起作用?
我没有连接点,我不确定这些点是否在gradle或groovy中。我已经通过文档和博客研究了一段时间但没有运气。我很感激一些帮助。感谢。
答案 0 :(得分:1)
您要查找的filter
方法在CopySpec
界面中定义,正好是here。 filesMatching
也在CopySpec
中声明,ProcessResources
- &gt; Copy
- &gt; AbstractCopyTask
和AbstractCopyTask
实现CopySpec
这些方法会在任务本身上调用。
令牌替换由来自Ant的ReplaceTokens
类完成,当涉及groovy String == String.class
中的语法时。过滤本身在this类中运行。
我建议您下载gradle源,将它们导入IDE并从ProcessResourcess
课程开始旅程 - 这是了解引擎盖下发生情况的最简单方法