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
不起作用 - 它应该!
我正在尝试实现一些东西来替换我的 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 interfaceContentFilterable
Parameters:
properties
- map of filter propertiesfilterType
- Class of filter to addReturns: 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
不起作用 - 它应该!