Gradle 项目工程的管理 实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译Java 源代码,拷贝文件, 打包Jar 文件,甚至可以是执行一个系统命令。另外,一个 Task 可以读取和设置Project 的Property 以完成特定的操作。
下面我们来看看如何编写 Gradle Task 任务。
可参考官方文档:https://docs.gradle.org/current/userguide/tutorial_using_tasks.html
我们在 build.gradle 文件编写 task 任务,如下:
1685894623286
// 自定义的任务1
task("task1") {
println "hello task1...."
}
// 自定义的任务2
task "task2" {
println "hello task2...."
}
// 自定义的任务3
task task3 {
// 任务的配置阶段执行
println "hello task3...."
// 任务的行为:在执行阶段执行,doFirst会在doLast执行之前执行
doFirst() {
println "task3 doFirst...."
}
doLast() {
println "task3 doLast...."
}
}
我们可以在终端输入 gradle 任务名称
来执行参数,同时可以增加参数 -i
打印 info 的参数,如下:
gradle -i task3
1685894792232
提示 1 :task3 的配置段是在配置阶段完成
提示 2 :task3 的doFirst、doLast 方法是执行阶段完成,并且doFirst 在doLast 执行之前执行。
**提示 3:**区分任务的配置段和任务的行为,任务的配置段在配置阶段执行,任务的行为在执行阶段执行
doFirst、doLast 两个方法可以在任务内部定义,也可以在任务外部定义:
// 自定义的任务3
task task3 {
// 任务的配置阶段执行
println "hello task3...."
// 任务的行为:在执行阶段执行,doFirst会在doLast执行之前执行
doFirst() {
println "task3 doFirst...."
}
doLast() {
println "task3 doLast...."
}
}
// 在task3外部定义doFirst doLast
task3.doFirst() {
println "task3 doFirst.... outter"
}
task3.doLast() {
println "task3 doLast.... outter"
}
执行 gradle task3
如下:
“可以看到外部定义的 doFirst 会比内部定义的 doFirst 较快执行,而外部定义的 doLast 会比内部定义的 doLast 较后执行。 ”
1685895007103
另外,task任务可以定义多个参数,我们再传入一个参数如下:
// 定义map
def map = new HashMap<String, Object>();
//action属性可以设置为闭包,设置task自身的行为
map.put("action", { println "taskD.." })
// 自定义的任务3
task(map, "task3") {
// 任务的配置阶段执行
println "hello task3...."
// 任务的行为:在执行阶段执行,doFirst会在doLast执行之前执行
doFirst() {
println "task3 doFirst...."
}
doLast() {
println "task3 doLast...."
}
}
// 在task3外部定义doFirst doLast
task3.doFirst() {
println "task3 doFirst.... outter"
}
task3.doLast() {
println "task3 doLast.... outter"
}
执行如下:
底层原理分析:无论是定义任务自身的 action,还是添加的doLast、doFirst 方法,其实底层都被放入到一个Action 的List 中了,最初这个 action List 是空的,当我们设置了 action【任务自身的行为】,它先将action 添加到列表中,此时列表中只有一个action,后续执行doFirst 的时候doFirst 在action 前面添加,执行 doLast 的时候doLast 在action 后面添加。doFirst 永远添加在actions List 的第一位,保证添加的Action 在现有的 action List 元素的最前面;doLast 永远都是在action List 末尾添加,保证其添加的Action 在现有的action List 元素的最后面。一个往前面添加,一个往后面添加,最后这个action List 就按顺序形成了doFirst、doSelf、doLast 三部分的 Actions,就达到 doFirst、doSelf、doLast 三部分的 Actions 顺序执行的目的。
提示 1:其中<<代表doLast,在gradle5.x 版本之后就废弃,不能使用了,如下所示:
task hello << {
println 'Hello world!'
}