编程语言爱好者程序园

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

2019-05-27  本文已影响0人  赵阳_c149

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。

所以这里并没有“两类”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,浅谈自动化构建工具

上一篇 下一篇

猜你喜欢

热点阅读