Gradle 任务

多种方式创建任务

1.直接以任务名字创建任务的方式:

def Task taskOne = task(task1)

taskOne.doLast{
    println "创建方法原型为:Task task(String name) throws InvalidUserDataException"
}

以上代码中的 task1 是任务名字,默认转为字符串类型,task方法返回一个 Task 类型,我们将对象赋给了 taskOne 这个变量,再通过 taskOne 做了一个 doLast 操作 ,任务的操作命令为 gradle -q task1

2.以一个任务名字和一个对该任务配置的 Map 对象来创建任务:

def Task taskTwo = task(task2,group:BasePlugin.BUILD_GROUP)

taskTwo.doLast {
    println "创建方法原型为:Task task(Map<String, ?> args, String name) throws InvalidUserDataException"
    println "任务分组:${taskTwo.group}"
}

和第一种方式大同小异,只是多了一个 Map 参数 ,用于对要创建的 Task 进行配置,我们的代码指定了分组为 BUILD ,下面是 Map 中可用的配置列出来。

3.任务名字和闭包配置的方式:

task taskThree {
    description '演示任务创建'
    enabled true
    doLast {
        println "创建方法原型为:Task task(String name, Closure configureClosure)"
        println "任务描述:${description}"
        println "enabled${enabled}"
    }
}

因为第二种方式可配置的项有限,所以可以通过闭包的方式进行更多灵活的配置。闭包里面委托的对象就是 Task 本身,所以我们可以使用 Task 的任务属性和方法。

4.使用 TaskContainer 创建任务 ,其实之前的创建方法在源码上,都是调用该方式创建的,Project 帮我们定义的 TaskContainer 的名字为 tasks ,这是 Project 的属性,我们可以直接调用 tasks 来创建任务,示例代码如下:

tasks.create('taskFour') {
        description '演示任务创建'
        enabled true
        doLast {
        println "创建方法原型为:Task create(String name, Closure configureClosure) throws InvalidUserDataException"
        println "任务描述:${description}"
            println "enabled${enabled}"
        }
    }

多种方式访问任务

1.我们可以通过该任务名称访问和操作任务:

task task1
task1.doLast {
    println 'task1.doLast'
}

2.通过 TaskContainer 来访问 ,其实 TaskContainer 是我们创建任务的集合:

task task2
tasks['task2'].doLast {
    println 'task2.doLast'
}

其实上述的方式在源码上是调用了 findByName(String name) 实现的。

3.通过路径来访问,有两种方式,分别是 getfind ,它们的区别在于 get 方法找不到任务时会抛出异常,find 方法找不到会直接返回 null

task task3
tasks['task3'].doLast {
    println tasks.findByPath('task3')
    println tasks.getByPath('task3')
    println tasks.findByPath('afasdf')
}

上述的方式的参数值可以是任务路径,也可以是任务名字。

4.通过名字来访问,也有两种方式,跟第3种方式的区别一样:

task task4
tasks['task4'].doLast {
    println tasks.findByName('task4')
    println tasks.getByName('task4')
    println tasks.findByName('afasdf')
}

这种方式只能传入任务名字,不能为路径。

任务的执行分析

当我们在执行一个 Task 的时候,其实就是执行其拥有的 actions 列表,这个列表保存在 Task 对象实例中的 actions 成员变量中,其类型是一个 List,现在我们把 Task 之前执行、Task 本身执行以及 Task 之后执行分别称为 doFirstdoSelfdoLast ,示例如下:

def Task myTask = task customTask(type: CustomTask)
myTask.doFirst{
    println 'Task执行之前执行 in doFirst'
}
myTask.doLast{
    println 'Task执行之后执行 in doLast'
}

class CustomTask extends  DefaultTask {

    @TaskAction
    def doSelf() {
        println 'Task自己本身在执行 in doSelf'
    }

}

我们定义了一种 Task 类型 CustomTask ,并声明了一个方法 doSelf,该方法被 TaskAction 注解标注,意思是该方法是 Task 本身执行的方法,执行顺序跟预期一样。