一、gradle任务执行
每一次Gradle执行一个build脚本,都会经历三个生命阶段
- initialization(初始化期)
- configuration(配置期)
- execution(执行期)
构建工作会依照它们的依赖关系在执行阶段按序执行。
任务对象(task object)会在配置阶段汇集到一个内部的对象模型当中,这个对象模型就是DAG(无环有向图)。
而Gradle在初始化阶段会决定将那些工程加入构建当中去,这个对于多工程(mutilproject)构建很重要。
二、任务定义和配置块
task hello
hello << {
println 'hello world'
}
hello.doLast {
println 'hello world'
}
hello {
println 'configuration block'
}
明确几个概念:
1) << 后面的{}和其中的内容被称为block(块)2) 每一个task都是一个对象
3) 直接跟在task后面的块就是配置块(configuration block)
左移符号”<<”在这里的作用是将后面的代码块附加到hello对象的Actions列表中,action就是要执行的代码。该符号的作用和hello.doLast的是相同的。
既然task是对象,就有相对应的方法:
doLast()在这里是一个函数,那么gradle中如何调用任务对象的函数呢?这里有两种方式:
1) taskObj.doLast {}
2) taskObj {
doLast{}
}
第一种形式很简单,不多说;
第二种形式的调用,是将doLast函数放到了Configuration Block当中。
这样的形式和taskObj.doList{}以及taskObj<<{}的作用是相同的,也就是说在build.gradle文件中定义
task hello
hello << {
println 'load test data'
}
hello {
doLast {
println 'doLast: drop the database '
}
println 'configuration: open the connection'
}
hello << {
println 'colse the database'
}
hello.doFirst {
println 'doFirst: create the database'
}
脚本执行的结果是
配置块都是先于任务(:hello)执行的,但是定义在Configuration Block的doLast和hello << {}以及 hello.doLast{}方法执行优先级相同。
而另一个与之相对的函数doFirst的用法类似。1) taskObj.doFirst{}
2) taskObj{
doFirst{}
}
task hello
hello.doFirst {
println 'doFirst later'
}
hello {
doFirst {
println 'doFirst (configuration)'
}
println 'configuration'
}
hello.doFirst {
println 'doFirst early'
}
脚本的执行结果
所以说不论是上述何种调用方式,doFirst方法都具有累加效应,先写后执行。