从task{doLast{}}看gradle build的三个阶段

Gradle是JVM生态下又一款开源的自动化构建工具,以基于Groovy的DSL描述构建过程,在结合了ant和maven的优点的基础上,提供了更为简洁,灵活和高效的build体验【1】。

Task代表了构建过程中的一个简单原子工作单元,类似于一个系统中的子函数。定义Task的目的是将一个大的构建过程划分为粒度较小,高内聚,低耦合,可重用的功能单位,提高构建脚本的开发效率,可读性以及可维护性。例如,java plugin提供的编译或者生成javadoc用的task。

在实际的项目中,会遇到“两类”task:

task myTask1 { 
  println ‘mytask’
}
task myTask2 () {    doLast{        println 'during run'    }}

通过两个实验,可以看出他们的区别:
首先,定义两个task

task simpleTask(){    println 'during simpleTask'}
task doLastTask() {    doLast{        println 'during doLastTask'    }}

实验一

./gradlew doLastTask
during simpleTask
:doLastTask
during doLastTask

实验二

./gradlew simpleTask 
during simple task
:simpleTask 

可以看到,运行simpleTask的时候,doLastTask没有运行;反过来,运行doLastTask的时候,simpleTask却运行了。
通过查看文档,我们可以知道,这是由gradle构建的运行机制决定的。gradle 构建的生命周期主要分为三个阶段,Initialization,Configuration,Execution。

  • Initialization:Gradle支持单个或多个工程的构建。在Initialization阶段,Gradle决定哪些工程将参与到当前构建过程,并为每一个这样的工程创建一个Project实例。一般情况下,参与构建的工程信息将在settings.gradle中定义。
  • Configuration:在这一阶段,配置project的实例。所有工程的构建脚本都将被执行。Task,configuration和许多其他的对象将被创建和配置。
  • Execution:在之前的configuration阶段,task的一个子集被创建并配置。这些子集来自于作为参数传入gradle命令的task名字,在execution阶段,这一子集将被依次执行。

所以这里并没有“两类”task,只是task的不同部分的step在build的不同阶段执行。即doLast内的部分在execution阶段执行(如果task名作为参数传入的话),doLast外的部分在configuration阶段执行,看第二组实验:

println 'This is done in configuration phase'task mytask1(){    println 'This is also done in configuration phase by mytask1'}task mytask2() {    doLast{        println 'This is done in execution phase by mytask2'    }    println 'This is also done in configuration phase by mytask2'}println 'This is done in configuration phase as well'

实验一

./gradlew 
This is done in configuration phase
This is also done in configuration phase by mytask1
This is also done in configuration phase by mytask2
This is done in configuration phase as well

实验二

./gradlew mytask2
This is done in configuration phase
This is also done in configuration phase by mytask1
This is also done in configuration phase by mytask2
This is done in configuration phase as well
:mytask2
This is done in execution phase by mytask2

可以看到,doLast之外的内容,无论如何都会执行,而且是在configuration阶段执行。而doLast内的内容只会在task名作为参数传入的时候才会执行,而且是在execute阶段执行。

【1】从make到gradle,浅谈自动化构建工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章