gradle Task 详解

文章详细介绍了Gradle中Task的定义、配置、执行阶段、依赖管理以及如何指定执行顺序。通过示例展示了如何创建Task,设置Task的属性如名称、描述和分组,以及如何在执行阶段添加doFirst和doLast操作。此外,还解释了Task的依赖关系和如何控制Task的执行顺序。最后,提到了如何引入其他gradle文件和将Task挂载到指定Task之后执行。
摘要由CSDN通过智能技术生成

目录

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"
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

又逢乱世

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值