Gradle核心之Task

Posted 我就是马云飞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gradle核心之Task相关的知识,希望对你有一定的参考价值。

前言

gradle命令最终是通过task去执行的,可见task在gradle中的重要性。

Task的定义与配置

task的定义有两种形式,一个是直接通过task函数去创建,另一个是通过task的create方法去创建,示例代码如下:

task test1Task
    println("test1Task")


tasks.create(name:'test2Task')
    println("test2Task")

刚刚我们为task指定了一个name。我们可以看看除了name我们还可以指定什么,我们打开Task的源代码,如下:

public interface Task extends Comparable<Task>, ExtensionAware 
    String TASK_NAME = "name";

    String TASK_DESCRIPTION = "description";

    String TASK_GROUP = "group";

    String TASK_TYPE = "type";

    String TASK_DEPENDS_ON = "dependsOn";

    String TASK_OVERWRITE = "overwrite";

    String TASK_ACTION = "action";
    /**
     * Constructor arguments for the Task
     *
     * @since 4.7
     */
    @Incubating
    String TASK_CONSTRUCTOR_ARGS = "constructorArgs";


下面我们介绍下这些属性都是用来干嘛的。

字段描述默认值
nameask 名字必须指定
descriptiontask 的描述信息null
group该 task 所属组null
type需要创建的 task ClassDefaultTask
dependsOn该 task 所依赖的 task 集合[]
overwrite替换一个已存在的 taskfalse
action当 task 执行的时候,需要执行的闭包 closure 或 行为 Actionnull
constructorArgs传递到 task Class 构造器中的参数null

Task的执行

前面我们也介绍了gradle的生命周期,通过前面的文章我们可以知道,在执行阶段gradle会输出每个gradle执行的内容。当然我们还可以通过doFirstdoLast为我们的 task 指定执行阶段要执行的代码。关于这2个的属性介绍如下:

  • doFirst :表示当前task执行最开始的时候被调用的Action。
  • doLast:表示单曲task即将执行完的时候被调用的Action。

我们可以验证下上面两个属性,执行代码如下:

task test1Task 
    doFirst 
        println("test1Task first")
    
    println("test1Tasking...")

    doLast 
        println("test1Task last")
    

输出结果如下:

> Configure project :
test1Tasking...

> Task :test1Task
test1Task first
test1Task last
:test1Task spend 17ms

Task的执行顺序

首先了解下,控制task执行顺序的方式有两种。

  • 通过dependsOn强依赖的方式
  • 通过api指定执行顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4yvgpM4w-1611850398784)(https://s3.ax1x.com/2021/01/25/sLQTc4.png)]

dependsOn强依赖

强依赖的方式又分为两种,动态依赖及静态依赖,我们来举个例子:

task test1Task 
    println("test1Tasking...")


task test2Task 
    println("test2Tasking...")

//静态依赖一
task test3Task(dependsOn: [test1Task, test2Task]) 
    println("test3Tasking...")

//静态依赖二
test3Task.dependsOn(test1Task, test2Task)
//动态依赖
task test4Task 
    dependsOn tasks.findAll  task ->
        return task.name.startsWith("test")
    

    println("test4Tasking...")

输出结果如下:

> Configure project :
test1Tasking...
test2Tasking...
test3Tasking...
test4Tasking...

需要注意的是,虽然我依赖了其他的task,但是依赖的task输出顺序它是随机的。

API指定输出顺序

关键字名称作用备注
mustRunAfter指定一个任务必须执行在另一个任务之后优先级小于dependsOn属性
shouldRunAfter指定一个任务应该执行在另一个任务之后一般不用

举个栗子:

task test2Task 
    println("test2Tasking...")


task test1Task 
    mustRunAfter test2Task
    println("test1Tasking...")


task test3Task 
    mustRunAfter test1Task
    println("test3Tasking...")

为了方便查看,我们把顺序修改了,不让它按照1、2、3的形式输出,现在我们看看上述代码的输出结果:

> Configure project :
test2Tasking...
test1Tasking...
test3Tasking...

Task类型

除了定义一个task之外,我们也可以使用task的type属性来直接使用一个已有的 task 类型,比如Gradle自带的Copy、Delete、Sync等等。

总结

本节我们介绍了Task的使用,除了上面介绍的,我们还可以通过gradle官网去查看task相关指令。

参考

暴力突破 Gradle 自动化项目构建(六)- Gradle 核心之 Task

本文首发于我的个人博客:Gradle核心之Task

更多文章请关注我的公众号:码农职场

以上是关于Gradle核心之Task的主要内容,如果未能解决你的问题,请参考以下文章

Gradle之Android Gradle Plugin 主要 Task 分析

Gradle(Task)-HelloWorld!

Gradle系列之构建脚本基础

深入理解gradle中的task

深入理解gradle中的task

Gradle task