提问人:overexchange 提问时间:5/27/2020 最后编辑:Jonathan Halloverexchange 更新时间:6/5/2020 访问量:1093
Groovy 中的 apply() 方法语法
apply() method syntax in groovy
问:
在以下语法中:
plugins({
id('application')
id 'java'
id('com.github.johnrengelman.shadow').version('4.0.1')
})
allprojects(
{
apply(plugin: 'application')
apply(plugin: 'java')
apply(plugin: 'com.github.johnrengelman.shadow')
repositories({
mavenCentral()
})
}
....
task copyDeps(type: Copy) {
from (configurations.runtime + configurations.testRuntime) exclude '*'
into '/tmp'
}
)
我的理解是,
apply()
方法传递 key-value ,其中 key 是 & value 是plugin: 'application'
plugin
'application'
从方法的语法方面来看,不是一个可读的语法:apply()
plugin: 'application'
1)我如何理解这个语法?类型的参数是通过方法传递的吗?apply(plugin: 'application')
plugin: 'application'
String
apply()
2)
以下语法
task copyDeps(type: Copy) { // Line 54
from (configurations.runtime + configurations.testRuntime) exclude '*'
into '/tmp'
}
写成
tasks.create('copyDeps', Copy, {
from(configurations.runtime + configurations.testRuntime).exclude('*')
into(buildDir)
}
)
但给出错误:
FAILURE: Build failed with an exception.
* Where:
Build file '/home/../build.gradle' line: 54
?
答:
2赞
injecteer
5/27/2020
#1
这是一个惯用的时髦“捷径”。
线
apply(plugin: 'application')
可以改写为:
apply( [ plugin: 'application' ] )
并表示,该方法是使用 Groovy Map 文本调用的。
Map literal 取代了 java 的:apply()
Map map = new HashMap();
map.put( "plugin", "application" );
如果作为最后一个参数的方法接受映射,则可以省略方括号。
该行也可以改写为:
apply plugin:'application'
根本没有括号。
更新:
第二个问题:
是的,它可以(如果它编译)。它看起来很丑,但很有效。
在 Groovy 中,如果 method 的最后一个参数是闭包,则可以将其写为
copyDeps( map ){ }
或
copyDeps map, {}
或(更 javaish)
copyDeps( map, {} )
更新2:
tasks.create('copyDeps', Copy, {})
并且这次也可以根据 ref-doc 在 Gradle 中互换。task copyDeps(type: Copy) {}
这是对类属性的普通方法调用,而表示另一个 Groovy 功能:DSL Builders ->这里使用 Gradle DSL 构建器。tasks.create()
task copyDeps()
评论
0赞
overexchange
5/27/2020
查询已编辑,您能回答第二个问题吗?
评论