我无法理解gradle中的groovy语法.
如果命名参数(在groovy中)使用:后缀,那么我假设代码apply plugin: 'java'意味着调用该函数apply(plugin = 'java').这很奇怪,因为apply甚至没有定义函数.以下在我的gradle脚本中给出了一个错误:
println apply.getClass()
> Could not get unknown property 'apply' for root project 'Simple' of type
org.gradle.api.Project.
Run Code Online (Sandbox Code Playgroud)
那么apply它定义的是什么?为什么上面的代码不打印apply元素的类?
还有一件我觉得奇怪的事情如下:
dependencies {
compile 'org.slf4j:slf4j-api:1.7.12'
testCompile 'junit:junit:4.12'
}
Run Code Online (Sandbox Code Playgroud)
语法表明包含的代码{}是一个闭包,但是什么是compile和testCompile元素?如果它是一个闭包,那么上面的代码将只返回'junit:junit:4.12'一个字符串,其余的应该无法编译.它看起来更像是地图的定义.但同样,如果上面的代码是数据,那么我应该能够在groovyshshell中输入它.
groovy:000> dependencies {
compile 'org.slf4j:slf4j-api:1.7.12'
testCompile 'junit:junit:4.12'
}
groovy:001> groovy:002> groovy:003> ERROR groovy.lang.MissingMethodException:
No signature of method: groovysh_evaluate.dependencies() is applicable for argument types: (groovysh_evaluate$_run_closure1) values: [groovysh_evaluate$_run_closure1@b7c4869]
Run Code Online (Sandbox Code Playgroud)
这对我来说很困惑.我认为gradle脚本只是groovy脚本,但似乎gradle DSL为groovy语言添加了元素.一个groovy clojure成为一个map,一个带有命名参数的函数调用变得不同.
有人可以在这个groovy DSL上启发我;)
plugin: 'java'
Run Code Online (Sandbox Code Playgroud)
是一张绝妙的地图。请参阅Project.apply() 文档以及groovy 文档中对此语法的解释。
关于依赖关系,请参阅DependencyHandler。
Groovy 是一种非常动态的语言,您实际上可以调用未声明的方法,并让处理程序根据调用的方法名称执行某些操作。AFAIK,这就是这里使用的技巧。查看源代码。
我不是一个出色的开发人员,虽然我发现 DSL 很优雅,但有时我也发现它令人困惑,因为我发现很难将 DSL 的某些部分链接到文档中的具体方法。但你最终会理解并习惯它。
| 归档时间: |
|
| 查看次数: |
445 次 |
| 最近记录: |