在Gradle中,构建的生命周期分成3个阶段,依次是:初始化、配置和执行。
首先,Gradle会在初始化阶段完成初始化任务,如执行初始化脚本的内容,同时还会为每个参与构建的项目创建Project实例;在接下来的配置阶段,它将完成Project对象的配置以及Task的创建和配置,这里执行的脚本就是build.gradle里定义在任何Task之外的那些脚本;在执行阶段,因为必然要至少对应一个Task,因此执行的就是Task里的内容。
除了上一篇里介绍的初始化脚本,针对每个项目,还可以把初始化阶段要执行的脚本放在每个项目目录的settings.gradle里面。该文件是构建多项目时必需的,对于单个项目则可有可无,它位于根项目的目录下。参考文档里有个例子非常形象地说明了各阶段要执行的脚本及其的位置:
//settings.gradle
println 'This is executed during the initialization phase.'
//build.gradle
println 'This is executed during the configuration phase.'
task configured {
println 'This is also executed during the configuration phase.'
}
task test << {
println 'This is executed during the execution phase.'
}
关于多项目的内容,我们将放到下一篇里详细介绍。这里,我们只需知道:如果是多项目,settings.gradle将定义包括在构建内的那些项目。所以,settings.gradle是判断构建是否是多项目的关键。这个判断是在初始化阶段完成的。
如果Gradle是在包含有settings.gradle的目录下运行的,那么项目包含定义和当前目录下的子目录就已经有足够信息让Gradle进行判断了。这种判断的真正难点发生在Gradle在一个没有settings.gradle的目录下运行的时候,原因是:settings.gradle并不是必需的,而且这个目录还有可能是一个根项目的子目录。对于这种情况,参考文档里给出了Gradle的解析办法:
- 在与当前目录同级的目录下,搜索是否存在一个名叫master的目录,看看它其中是否有settings.gradle。
- 要是没有找到,则搜索父目录是否包含这个文件。
- 要是还没有,那当前构建按单项目处理。
- 反之,则检查当前项目是否是该settings.gradle多项目层次结构里的一部分。如果不是,则当作单项目;否则,作为多项目对待。
在了解完Gradle判断构建是否是多项目之后,让我们最后来看看如何接收来自构建生命周期的各种通知:
- 接收来自计算Project前后的通知,使用Project对象的beforeEvaluate和afterEvaluate,利用Gradle对象的beforeProject和afterProject可以达到同样的目的。后者可以通过Project.getGradle()获得。需要注意的是,afterProject不论Project是否创建成功,它都会被触发。
- 对于任务的创建,可以使用TaskContainer的whenTaskAdded获得相关通知。
- 任务执行前后的通知是利用TaskExecutionGraph对象的beforeTask和afterTask实现的。
以上做法在参考文档中都给出了例子,这里就不再列出。除了上面的这些做法,我们还可以通过直接给相关对象添加监听器的方法实现同一目的,这应该也没什么太大的难度,只消勤查API就行了。
本系列的其它部分:

最新评论
9 周 6 小时之前
9 周 1 天之前
11 周 5 天之前
11 周 5 天之前
17 周 2 天之前
17 周 4 天之前
19 周 3 天之前
20 周 1 天之前
20 周 2 天之前
20 周 5 天之前