Gradle 的 CopySpec 过滤器方法签名与给出的示例有何关系?

How does Gradle's CopySpec filter method signature relate to the example given?

我正在尝试实现一些东西来替换我的 build.gradle 文件中的 xml 文件中的 ${pattern}

processResources {
    eachFile { FileCopyDetails fileCopyDetails ->
        if (fileCopyDetails.name.contains("blueprint.xml")) {
            project.logger.quiet "Processing: " + fileCopyDetails.path
            logger.quiet "" + project.ext.properties.entrySet()
            filter(org.apache.tools.ant.filters.ReplaceTokens, tokens: [prop1, value, prop2, value])
        }
    }
}

tokens: 似乎拿了一张地图。同样,这与函数签名有何关系?

将所有具有字符串值的属性转换为 Map 以输入到 tokens:

def tokenMap = new LinkedHashMap()
def stringProps = project.ext.properties.entrySet().findAll { entry -> entry.getValue() instanceof String }
stringProps.each { entry -> tokenMap.put(entry.key, entry.value)}

查看 Gradle Javadoc 会发现一个过滤器函数,其签名似乎与示例不匹配。 特别是,据我所知,Map<String,?>Class<? extends FilterReader> 与示例中的顺序不匹配。 有人可以将示例映射到函数签名,以便我明白这是怎么回事了?

CopySpec filter​(Map<String,​?> properties,
            Class<? extends FilterReader> filterType)

Adds a content filter to be used during the copy. Multiple calls to filter, add additional filters to the filter chain. Each filter should implement java.io.FilterReader. Include org.apache.tools.ant.filters.* for access to all the standard Ant filters.

Filter properties may be specified using groovy map syntax.

Examples:

filter(HeadFilter, lines:25, skip:2)
filter(ReplaceTokens, tokens:[copyright:'2009', version:'2.3.1'])  

Specified by:

filter in interface ContentFilterable

Parameters: properties - map of filter properties filterType - Class of filter to add

Returns: this


相关:


注:

SimpleTemplateEngine 不起作用

processResources {
    filesMatching("**/features.xml") {
        // expand uses Groovy's SimpleTemplateEngine
        project.logger.quiet "Processing: " + file
        expand project.getProperties()
    }

这实际上是底层 Groovy 语法的一个特性。 Groovy 允许您在方法的第一个参数声明为 Map 时按名称指定方法参数(即 <name>: <value>)。至关重要的是,命名参数可以出现在参数列表中的任何点,甚至在所谓的位置参数之后(即在方法签名中的 Map 之后声明的参数),并且它们将作为初始 Map 参数中的条目。有关详细信息,请参阅 Groovy Language Documentation 中的 混合命名参数和位置参数 部分。

因此,Gradle filter 方法具有签名

CopySpec filter​(Map<String,​?> properties, Class<? extends FilterReader> filterType)

第一个properties参数的类型是Map,所以这个方法可以用命名参数调用。此外,还有一个位置参数filterType。因此,要调用此方法,您必须指定一个没有名称的参数,类型为 Class<? extends FilterReader>,将用于 filterType,以及零个或多个命名参数,这些参数将全部放在 properties 地图.

以文档中的示例之一为例:

filter(HeadFilter, lines:25, skip:2)

将意味着 filter 被调用

properties = [
  lines: 25,
  skip: 2
]
filterType = HeadFilter

以下任何调用都是等效的:

filter(lines:25, skip:2, HeadFilter)
filter(lines:25, HeadFilter, skip:2)
filter([lines:25, skip:2], HeadFilter)

此处的最后一次调用按位置传递两个参数(当第一个参数声明为 Map 时,您 没有 使用命名参数)。

旁注

我很好奇为什么使用 expand 不起作用 - 它应该!