gradle脚本是用groovy编写的吗?

sha*_*aft 5 groovy gradle

我无法理解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)

语法表明包含的代码{}是一个闭包,但是什么是compiletestCompile元素?如果它是一个闭包,那么上面的代码将只返回'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上启发我;)

JB *_*zet 3

plugin: 'java' 
Run Code Online (Sandbox Code Playgroud)

是一张绝妙的地图。请参阅Project.apply() 文档以及groovy 文档中对此语法的解释。

关于依赖关系,请参阅DependencyHandler

Groovy 是一种非常动态的语言,您实际上可以调用未声明的方法,并让处理程序根据调用的方法名称执行某些操作。AFAIK,这就是这里使用的技巧。查看源代码

我不是一个出色的开发人员,虽然我发现 DSL 很优雅,但有时​​我也发现它令人困惑,因为我发现很难将 DSL 的某些部分链接到文档中的具体方法。但你最终会理解并习惯它。