gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 03:11:05 25 4
gpt4 key购买 nike

我正在尝试实现一些将替换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 。同样,这与功能签名有何关系?

将所有具有字符串值的属性转换为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



有关:

How is a token replaced in a file for a Gradle build product?

注意:

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

最佳答案

这实际上是基础Groovy语法的功能。 Groovy允许您在方法的第一个参数声明为<name>: <value>时按名称(即Map)指定方法参数。至关重要的是,即使在所谓的位置参数(即方法签名中的Map之后声明的位置参数)之后,命名参数也可以出现在argumemt列表中的任何位置,并将它们作为条目放置在初始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不起作用感到好奇-它应该!

关于java - Gradle的CopySpec过滤器方法签名与给定的示例有何关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58500610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com