Warm tip: This article is reproduced from serverfault.com, please click

groovy-什么是摇篮

(groovy - What are Gradle)

发布于 2020-11-30 19:09:19

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

这里有个简单的例子:

buildscript {
}

allprojects {
}

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

subprojects {
}

我知道xMethod(){}是Groovy中定义的方法。

但是所有其他“脚本块详细信息”(如allproject和subprojects)又是什么呢?它们代表了Gradle中的哪些构造?它们是如何执行的?

Questioner
RenatoIvancic
Viewed
11
Matias Bjarland 2020-12-01 20:03:14

这里有几件事在起作用。

  1. 在常规情况下,如果定义方法:
def foo(Closure c) {
  ...
}

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

foo({ println "hello world" })

或因为为该方法定义的最后一个参数是闭包,所以你也可以像这样调用它:

foo { 
  println "hello world"
}
  1. 当gradle执行build.gradle文件时,它会在生命周期阶段执行我建议你通读本节以了解该过程。通常,所有allprojects { ... }etc块都将在运行任何任务之前运行的配置阶段中执行。buildscript { ... }就我所知,块是一种特殊情况,其中gradle为build.gradle文件本身构建类路径,并且它在特殊阶段之前执行其他任何操作。

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

综上所述,语法如下:

buildscript { 

}

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

你提到的所有其他呼叫也是如此。

gradle dsl参考是了解这些内容的一个好地方,它也将你带到相关的委托类javadocs(例如上面的项目委托)。