我想了解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中的哪些构造?它们是如何执行的?
这里有几件事在起作用。
def foo(Closure c) {
...
}
可以通过两种方式调用此方法:
foo({ println "hello world" })
或因为为该方法定义的最后一个参数是闭包,所以你也可以像这样调用它:
foo {
println "hello world"
}
当gradle执行build.gradle
文件时,它会在生命周期阶段执行。我建议你通读本节以了解该过程。通常,所有allprojects { ... }
etc块都将在运行任何任务之前运行的配置阶段中执行。buildscript { ... }
就我所知,该块是一种特殊情况,其中gradle为build.gradle
文件本身构建类路径,并且它在特殊阶段之前执行其他任何操作。
当gradle执行build.gradle
文件时,它将gradle Project类的实例用作“委托”。这意味着对于gradle无法在你的构建文件中直接找到的任何方法,它将尝试在项目实例上找到它们。
综上所述,语法如下:
buildscript {
}
实际上是对带有签名的方法的方法调用,def buildscript(Closure c)
其中gradle首先会在build.gradle
文件中查找此方法,如果找不到,它将在项目实例中查找并在其中找到buildscript方法。
你提到的所有其他呼叫也是如此。
gradle dsl参考是了解这些内容的一个好地方,它也将你带到相关的委托类javadocs(例如上面的项目委托)。
这次真是万分感谢!特别是第一点。我在Groovy语言文档中搜寻了一个小时,试图弄清楚哪种语言构造对应于一个名称,后跟一个块。在我看来,这只是一个函数调用,省略了括号,其中一个参数是闭包。现在这一切都说得通了。