task (name: actionTest, action: new Action() {
@Override
void execute(Task task) {
println ‘hello’
}
}) {
}
等同于
task (name: actionTest) {
doFirst {
println ‘hello’
}
}
-
override
:默认为 false。是否替换已存在的 task。 -
group
:默认为 null。task 的分组类型。 -
description
:默认为 null。task 描述。 -
constructorArgs
:默认为 null。传给 task 构造函数的参数。
后面四种大部分开发过程中应该不怎么会用到,有需要的读者自行查阅文档。
task 内容格式
- 根据官方文档以及前一篇文章中可以知道,如果想给 task 添加操作,可以添加在
doLast {}/doFirst {}
等闭包中,例如:
task myTask {
doFirst {
println ‘myTask 最先执行的内容’
}
doLast {
println ‘myTask 最后执行的内容’
}
// warning
// println ‘Configuration 阶段和 Execution 阶段皆会执行’
}
切记大部分的内容是写在
doLast{}
或doFirst{}
闭包中,因为写在如果写在 task 闭包中的话,会在Configuration
阶段也被执行。
- 根据官方文档可知,为了提高 task 复用性,Gradle 还支持 Task 类的书写——
2.1 将下述代码写在 build.gradle
中,并用 @TaskAction
标记想要执行的方法。
class GreetingTask extends DefaultTask {
String greeting = ‘hello from GreetingTask’
@TaskAction
def greet() {
println greeting
}
}
2.2 在 build.gradle
中撰写 task 调用 GreetingTask 类:
// Use the default greeting
task (name: hello , type: GreetingTask)
// Customize the greeting
task (name: greeting , type: GreetingTask) {
greeting = ‘greetings from GreetingTask’
}
2.3 调用该 task——
./gradlew hello
Task :app:hello
hello from GreetingTask
./gradlew greeting
Task :app:greeting
greetings from GreetingTask
所以看到这里应该不仅能够理解 Task 类的书写,并且应该能够大致明白 type
这个参数的含义了。
不知道会不会和笔者一样事儿逼的读者此时会疑惑 @TaskAction
修饰的方法和 doLast {}
以及 doFirst {}
闭包的执行顺序是怎样的?
task (name: hello, type: GreetingTask) {
doFirst {
def list = getActions()
for (int i = 0; i < list.size(); i++) {
println list.get(i).displayName
}
}
doLast {
}
}
首先声明 doFirst {}
和 doLast {}
闭包;然后戳进 DefaultTask 源码并追踪到顶级父类 AbstractTask 中可以看到内部通过使用