task执行顺序dependsOn
一个 Task 是由一序列 Action (动作)组成的,当运行一个 Task 的时候,这个 Task 里的 Action 序列会按顺序依次执行。
doFirst\doLast之外的代码只是配置代码,它们并不是 Action ,Task 里的 Action 只会在该 Task 真正运行时执行,Gradle 里通过 doFirst、doLast 来为 Task 增加 Action 。
-
doFirst:task执行时最先执行的操作
-
doLast:task执行时最后执行的操作
-
task内除了doFirst、doLast之外都是配置时执行
配置顺序:从上到下
task内执行顺序:doFirst -> doLast
task间可以通过mustRunAfter vs dependsOn vs finalizedBy调整顺序
-
dependsOn - 设置任务依赖关系。
-
mustRunAfter - 设置任务执行顺序。
-
finalizedBy - 为任务添加一个当前任务结束后立马执行的任务
测试: 定义task1、task2、task3、task4,并让他们按照4321的顺序执行
task task2 {
sleep 1000
println "=====task2====="
doFirst {
sleep 1000
println "=====task2 first====="
}
doLast {
sleep 1000
println "=====task2 last====="
}
}
task task4 {
sleep 1000
println "=====task4====="
doFirst {
sleep 1000
println "=====task4 first====="
}
doLast {
sleep 1000
println "=====task4 last====="
}
}
task task3 {
sleep 1000
println "=====task3====="
doFirst {
sleep 1000
println "=====task3 first====="
}
doLast {
sleep 1000
println "=====task3 last====="
}
}
task task1() {
//configure
task3.dependsOn task4
task2.dependsOn task3
task1.dependsOn task2
//configure
println "=====task1====="
//action
doFirst {
println "=====task1 first====="
}
//action
doLast {
println "=====task1 last====="
}
}
//
//Executing tasks: [task1]
//
//
//> Configure project :app
//=====task2=====
//=====task4=====
//=====task3=====
//=====task1=====
//
//> Task :app:task4
//=====task4 first=====
//=====task4 last=====
//
//> Task :app:task3
//=====task3 first=====
//=====task3 last=====
//
//> Task :app:task2
//=====task2 first=====
//=====task2 last=====
//
//> Task :app:task1
//=====task1 first=====
//=====task1 last=====
自定义Task类
//自定义Task类,必须继承自DefaultTask
class SayHelloTask extends DefaultTask {
String msg = "default name"
int age = 18
//构造函数必须用@Inject注解标识
@Inject
SayHelloTask(int age) {
this.age = age
}
//通过@TaskAction注解来标识该Task要执行的动作
@TaskAction
void sayHello() {
println "Hello $msg ! age is ${age}"
}
}
//通过constructorArgs参数来指定构造函数的参数值
task hello1(type: SayHelloTask, constructorArgs: [30])
//通过type参数指定task的父类,可以在配置代码里修改父类的属性
task hello2(type: SayHelloTask, constructorArgs: [18]) {
//配置代码里修改 SayHelloTask 里的字段 msg 的值
msg = "xq"
age = 25
}