gpt4 book ai didi

gradle - Gradle 脚本是用 Groovy 编写的吗?

转载 作者:行者123 更新时间:2023-12-02 08:39:37 24 4
gpt4 key购买 nike

我无法理解 gradle 中的 groovy 语法。

如果命名参数(在 groovy 中)使用 : 后缀,那么我假设代码 apply plugin: 'java' 意味着调用函数 应用(插件='java')。这很奇怪,因为函数 apply 甚至没有定义。以下在我的 gradle 脚本中给出了一个错误:

println apply.getClass()
> Could not get unknown property 'apply' for root project 'Simple' of type
org.gradle.api.Project.

那么什么是apply,它是在哪里定义的?为什么上面的代码不只打印 apply 元素的类?

另一件事对我来说很奇怪:

dependencies {
compile 'org.slf4j:slf4j-api:1.7.12'
testCompile 'junit:junit:4.12'
}

语法表明 {} 中包装的代码是一个闭包,但是 compiletestCompile 元素是什么?如果它是一个闭包,那么上面的代码将仅返回 'junit:junit:4.12' 作为字符串,其余部分应该无法编译。看起来它更像是 map 的定义。但同样,如果上面的代码是数据,那么我应该能够在 groovysh shell 中输入它。

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]

这让我很困惑。我认为 gradle 脚本只是 groovy 脚本,但 gradle DSL 似乎为 groovy 语言添加了元素。常规的 clojure 变成了映射,带有命名参数的函数调用变成了不同的东西。

有人可以启发我这个绝妙的 DSL 吗 ;)

最佳答案

plugin: 'java' 

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

关于依赖关系,请参阅DependencyHandler

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

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

关于gradle - Gradle 脚本是用 Groovy 编写的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43700839/

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