多种方式创建任务
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.通过路径来访问,有两种方式,分别是 get 和 find ,它们的区别在于 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 之后执行分别称为 doFirst 、doSelf 、doLast ,示例如下:
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 本身执行的方法,执行顺序跟预期一样。