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

What are Gradle - Script block details

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

举个简单的例子:

buildscript {
}

allprojects {
}

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

subprojects {
}

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

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

这里有几件事在起作用。

  1. 在groovy中如果你定义了一个方法:
def foo(Closure c) {
  ...
}

该方法有两种调用方式:

foo({ println "hello world" })

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

foo { 
  println "hello world"
}
  1. 当 gradle 执行 build.gradle 文件时,它会在 lifecycle phases 中执行。我建议通读该部分以了解该过程。一般来说,所有 allprojects { ... } 等块都将在配置阶段执行,即 运行 在你的任何任务 运行 之前。据我所知,buildscript { ... } 块是一种特殊情况,其中 gradle 为 build.gradle 文件本身构建了 class 路径,并且在执行任何操作之前在特殊阶段执行否则。

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

综上所述,语法:

buildscript { 

}

实际上是对签名为 def buildscript(Closure c) 的方法的方法调用,其中 gradle 将首先在您的 build.gradle 文件中查找此方法,如果找不到,它将在项目实例和 find the buildscript method there.

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

了解这些的一个好地方是 gradle dsl reference,它还指向相关委托 class javadoc(如上面的项目委托)。