多种方式创建任务
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
本身执行的方法,执行顺序跟预期一样。