gradle :task

task执行顺序dependsOn

一个 Task 是由一序列 Action (动作)组成的,当运行一个 Task 的时候,这个 Task 里的 Action 序列会按顺序依次执行。

doFirst\doLast之外的代码只是配置代码,它们并不是 Action ,Task 里的 Action 只会在该 Task 真正运行时执行,Gradle 里通过 doFirst、doLast 来为 Task 增加 Action 。

  • doFirst:task执行时最先执行的操作

  • doLast:task执行时最后执行的操作

  • task内除了doFirst、doLast之外都是配置时执行

配置顺序:从上到下

task内执行顺序:doFirst -> doLast

task间可以通过mustRunAfter vs dependsOn vs finalizedBy调整顺序

  • dependsOn - 设置任务依赖关系。

  • mustRunAfter - 设置任务执行顺序。

  • finalizedBy - 为任务添加一个当前任务结束后立马执行的任务

测试: 定义task1、task2、task3、task4,并让他们按照4321的顺序执行


task task2 {
    sleep 1000
    println "=====task2====="
    doFirst {
        sleep 1000
        println "=====task2 first====="
    }
    doLast {
        sleep 1000
        println "=====task2 last====="
    }
}


task task4 {
    sleep 1000
    println "=====task4====="
    doFirst {
        sleep 1000
        println "=====task4 first====="
    }
    doLast {
        sleep 1000
        println "=====task4 last====="
    }
}


task task3 {
    sleep 1000
    println "=====task3====="
    doFirst {
        sleep 1000
        println "=====task3 first====="
    }
    doLast {
        sleep 1000
        println "=====task3 last====="
    }
}


task task1() {
    //configure
    task3.dependsOn task4
    task2.dependsOn task3
    task1.dependsOn task2
    //configure
    println "=====task1====="

    //action
    doFirst {
        println "=====task1 first====="
    }
    //action
    doLast {
        println "=====task1 last====="
    }
}
//
//Executing tasks: [task1] 
//
//
//> Configure project :app
//=====task2=====
//=====task4=====
//=====task3=====
//=====task1=====
//
//> Task :app:task4
//=====task4 first=====
//=====task4 last=====
//
//> Task :app:task3
//=====task3 first=====
//=====task3 last=====
//
//> Task :app:task2
//=====task2 first=====
//=====task2 last=====
//
//> Task :app:task1
//=====task1 first=====
//=====task1 last=====

自定义Task类

//自定义Task类,必须继承自DefaultTask
class SayHelloTask extends DefaultTask {

    String msg = "default name"
    int age = 18

    //构造函数必须用@Inject注解标识
    @Inject
    SayHelloTask(int age) {
        this.age = age
    }

    //通过@TaskAction注解来标识该Task要执行的动作
    @TaskAction
    void sayHello() {
        println "Hello $msg ! age is ${age}"
    }

}

//通过constructorArgs参数来指定构造函数的参数值
task hello1(type: SayHelloTask, constructorArgs: [30])

//通过type参数指定task的父类,可以在配置代码里修改父类的属性
task hello2(type: SayHelloTask, constructorArgs: [18]) {
    //配置代码里修改 SayHelloTask 里的字段 msg 的值
    msg = "xq"
    age = 25
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值