什么是 Gradle - 脚本块详细信息

Ren*_*cic 1 groovy gradle build.gradle

我想了解 build.gradle 文件的结构,特别是脚本块详细信息部分。

这是一个简单的例子:

buildscript {
}

allprojects {
}

// Custom defined method that will be invoked from other parts of the script
def xmethod() {
}

subprojects {
}
Run Code Online (Sandbox Code Playgroud)

据我了解,xMethod(){}是 Groovy 中定义的方法。

但是所有其他“脚本块详细信息”(例如所有项目和子项目)是什么?...?它们代表 Gradle 中的哪些构造?他们是如何被处决的?

Mat*_*and 5

这里有一些事情在起作用。

  1. 在 groovy 中如果定义一个方法:
def foo(Closure c) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

该方法可以通过两种方式调用:

foo({ println "hello world" })
Run Code Online (Sandbox Code Playgroud)

或者由于为该方法定义的最后一个参数是一个闭包,您也可以这样调用它:

foo { 
  println "hello world"
}
Run Code Online (Sandbox Code Playgroud)
  1. 当 gradle 执行文件时,它在生命周期阶段build.gradle执行。我建议通读该部分以了解该过程。一般来说,所有的etc 块都将在配置阶段执行,该阶段在任何任务运行之前运行。据我了解,该块是一种特殊情况,其中 gradle 为文件本身构建类路径,并且在其他任何事情之前在特殊阶段执行。allprojects { ... }buildscript { ... }build.gradle

  2. 当 gradle 执行文件时,它使用gradle Project 类build.gradle的实例作为“委托”。这意味着对于 gradle 无法直接在构建文件中找到的任何方法,它将尝试在项目实例上查找它们。

综上所述,语法:

buildscript { 

}
Run Code Online (Sandbox Code Playgroud)

实际上是对具有签名的方法的方法调用def buildscript(Closure c),其中 gradle 将首先在您的文件中查找此方法build.gradle,如果没有找到,它将在项目实例中查找并在那里找到 buildscript 方法

您提到的所有其他电话也是如此。

理解这些内容的一个好地方是gradle dsl 参考,它还向您指出相关的委托类 javadocs(如上面的项目委托)。

  • 这次真是万分感谢!特别是第一点。我花了一个小时搜索 Groovy 语言文档,试图找出与名称后跟块相对应的语言结构。我没有想到这只是一个省略了括号的函数调用,其中一个参数是一个闭包。现在一切都有意义了。 (2认同)