gradle Task 详解
目录
Task定义和配置
Task的执行阶段
Task 的依赖
Task 指定执行顺序
Task 主gradle引入其他的gradle文件
将某一个task挂载到指定的task之后执行
gradle task官网:Task - Gradle DSL
Task定义和配置
查看工程下所有的task,使用如下命令
gradle tasks
定义一个task
task创建的源码
参数分别是 task 名称,和一个 closure。groovy语法的closure可以写在小括号外面,小括号可以省略
task的源码
public interface Task extends Comparable<Task>, ExtensionAware {
String TASK_NAME = "name";
String TASK_DESCRIPTION = "description";
String TASK_GROUP = "group";
String TASK_TYPE = "type";
// 指定当前task的依赖的其他task
String TASK_DEPENDS_ON = "dependsOn";
// 重写 task
String TASK_OVERWRITE = "overwrite";
// 配置 task 任务逻辑
String TASK_ACTION = "action";
// 构造参数
String TASK_CONSTRUCTOR_ARGS = "constructorArgs";
}
语法
task 自定义task名称
示例
task mytask {
println "hello task."
}
执行自定义task
./gradle mytask
定义task也可以使用上面源码中的 TaskContainer 方式创建一个task
示例
this.tasks.create('mytask2') {
println "hello task2."
}
给 task 添加分组
示例
// 给 自定义task 添加group 和 desc
// 示例一
task mytask1(group: "testGroup", description: "is am a test") {
println "hello task1."
}
// 示例二
task mytask2 {
setGroup("testGroup")
setDescription("is am a test")
}
添加分组的 task,在idea gradle项中会放在一个新组中,没有分组的自定义task会放在 other 中
Task的执行阶段
关于gradle的阶段请查看:gradle生命周期
配置阶段
普通定义的task都是在配置阶段都会被执行。
执行阶段
执行阶段就是特意使用了 gradle xxx 的方式指定某一个task执行。taks才会执行。其他命令task不会执行。
执行阶段的task,在配置阶段不会被执行。只有task才能在执行阶段被执行。使用如下两个函数,让 task 在gradle 执行阶段执行
- doFirst:在task之前添加逻辑 // 在 @TaskAction 前面执行
- 注解:@TaskAction,使用该注解的自定义task类中的代码也会在执行阶段执行
- doLast:在task之后添加逻辑,(<< 表示 doLast,但是在gradle5.0版本中被移除) // // 在 @TaskAction 后面执行
示例
// 示例一
task testTask(group: "testGroup", description: "is am a test") {
doFirst {
println "hello doFirst. " + group
}
}
// 示例二
testTask.doLast {
println "hello doLast. " + description
}
// 示例三 << 表示 doLast,在gradle 5.0版本中 << 符号被移除
task testTask2 << {
println "hello doLast."
}
Task 的依赖
有3个task,taskA、taskB、taskC,taskA依赖taskB、taskC
//task taskA(dependsOn:"taskB"){ // 一个依赖的写法
// 被依赖的task定义在当前task后面,dependsOn参数要使用字符串""的方式
//task taskA(dependsOn:["taskB", "taskC"]){ // 多个依赖的写法
// doLast {
// println "taskA"
// }
//}
task taskB {
doLast {
println "taskB"
}
}
task taskC {
doLast {
println "taskC"
}
}
// 被依赖的task在当前task之前,dependsOn参数可以直接使用变量的方式
task taskA(dependsOn:taskB){
doLast {
println "taskA"
}
}
// 或者使用这种方式
//taskA.dependsOn([taskB, taskC])
为task添加指定前缀的task依赖
task libA {
doLast{
println "libA"
}
}
task libB {
doLast {
println "libB"
}
}
// 被依赖的要定义在前面,不然找不到
task taskTest {
dependsOn this.tasks.findAll { task ->
return task.name.startsWith("lib")
}
doLast {
println "taskTest = " + dependsOn
}
}
Task 指定执行顺序
有3个task,taskA、taskB、taskC,让task按照 A、B、C的顺序依次执行
task taskA {
doLast {
println "taskA"
}
}
task taskB {
mustRunAfter taskA // 可以使用数组参数
doLast {
println "taskB"
}
}
task taskC {
mustRunAfter taskB
doLast {
println "taskC"
}
}
执行命令:gradle taskB taskC taskA
Task 主gradle引入其他的gradle文件
有一个 a.gradle 文件,如果需要让该文件生效。需要在主gradle文件中引用a.gradle
语法
apply from: 文件路径
示例
apply from: this.rootProject.file("a.gradle")
将某一个task挂载到指定的task之后执行
例如:在 task build 执行完成之后,接着自动执行 task a
this.afterEvaluate { org.gradle.api.Project project ->
// 找到 build task
def buildTask = project.tasks.getByName('build')
if (buildTask == null) {
throw GradleException("build task is not found.")
}
// 执行 build task 之后的 taskA
buildTask.finalizedBy "taskA"
}
task taskA {
doLast {
println "taskA"
}
}