详解Task 的使用(四)

版权声明:转载请申明出处,谢谢 https://blog.csdn.net/qq_35495763/article/details/86235835

update time: 2019-1-10 Author:要你命三千又三千 type:学习笔记

问题一:如何创建一个任务

多种方式创建任务简介

方法一:task(name)

使用task()方法来创建对象

def Task ex41CreateTask1=task(ex41CreateTask1)//创建一个任务调用task()方法
ex41CreateTask1.doLast { //为其配置doLast 方法。
println "创建方法的原型为 :Task task(String name) throws InvalidUserDataException"
}//

方法二 task(参数1,map(task配置))

使用Map对象来补充一个配置(同样使用task 创建,但是多配置一个Map配置参数对象)

def Task ex41CreateTask2=task(ex41CreateTask2,group:BasePlugin.BULLD_GROUP)
....同上
//补充说明这个Map可用配置有

在这里插入图片描述

方法三:任务名+闭包配置(参数)

task ex41CreateTask3 {
doLast{//闭包中的委托对象(delegate)就是Task .
println '创建方法原型:Task task(String name,Closure configureClousure)"
}

总结:以上方法task ()都是调用taskContainer 来创建任务的。

方法四:使用原生方法tasks.create(name){}

//tasks 是project的对象属性 ,类型为:TaskContainer.
tasks.create('ex41Create4') {
doLast {  //这里必须理解的是doLast 是一个方法,后面的闭包是doLast(closure )
         // 的参数 ,拿到括号外面区,省略括号。
 println '创建方法为:task create(string name,closure configureClosure) throws InvalidUserDataException"
 }
}

问题二 :访问任务(task)

2.1 直接通过任务名来访问任务和操纵任务
在这里插入图片描述
2.3 通过project的(集合)tasks属性,来访问任务对象

task ex42AccessTask2
task['ex42AccessTask2'].doLast{
.....
}//解释这里的[] 是一个groovy 包装的运算符,相当于(tasks.getAt("ex42AccessTask2"))

2.4 根据路径方位,根据名称访问
在这里插入图片描述
问题:findbyPath()中的参数如何确定?待解答(这里我自己是用相对路径写的,绝对路径如何写)
在这里插入图片描述

在这里插入图片描述
运行结果
在这里插入图片描述

任务分组与描述

作用:便于任务识别与归类整理。
解释
分组:实质就是任务进行分类
描述:就是添加说明信息
操作:如何添加

def task myTask=task ec43Grouptask
//添加分组
myTask.group =BasePlugin.BULLD_GROUP
myTask,description="这是一个构建的引导任务"

在build.gradle 添加以下两行命令
在这里插入图片描述
任务的结果为
在这里插入图片描述
在AS IDE 中的效果图为
鼠标悬停即可显示任务描述(任务说明信息)
在这里插入图片描述

一个问题补充:<<的含义

groovy 中“<< ” 是leftshift()的重载操作(这里的含义就是doLast方法,都是将对象(doLast动作对象,list集合对象)放在最后)
在这里插入图片描述
与以下方法同义
在这里插入图片描述
在这里插入图片描述

问题如何理解一个task 的执行过程

结构:list类型的actions属性 存放动作。

这里根据描述大概含义模拟得出的结构(真正的结构肯定比这个复杂)
Task{ //task 是一个类型(类)
private List<ContextAwareTaskAction> actions= new ArrayList<>();//actions是
//一个action的列表(ContextAwareTaskAction是action包装后传递给它的)参数 
......                                    
public Task doFirst(final Closure action){
......
 public void run(){
       
       actions.add(0,action);//将doFirst 传递的闭包加入列表的第一个位置
    }
.....
}
public task doLast(final Closure action){}
//同理doLast()的闭包参数加入到actions的最后。(这里的参数就是doLast后的闭包,这里
//是省略语法)
}

//补充添加到actions时机:task 本生的action,在定义使用Map 来配置参数时天添加。
//**关键**:在创建task 添加自己的Map参数的中配置的action

关键字:task加入到actions列表中,执行actions 的对象。
doFirst()添加到第一位,doLast()添加到最后一位。

任务排序(任务之间的关系,上一个是action的执行顺序在action内部)

本质: 控制一个任务应该或者一定在某个任务后执行(从而达到一定程度的控制任务执行顺序,而不是仅仅通过dependsOn的方式)
如何用

taskB.shouldRunAfter(taskA)----b应该运行在a之后执行(非必须,有可能无效(a在b之后运行))
taskB.mustRunAfter(taskA)表示taskB必须在taskA之后执行(必须

举例:如何使用mustRunAfter()
在这里插入图片描述
运行结果是
在这里插入图片描述

任务的启用与禁止

使用enable 属性来,在调用此任务时是判断是否跳过
enable属性需要在执行到具体的逻辑的时候进行判断设置。

mytask.enable =“true”(启用任务)
mytask.enable=“false”(禁止此任务,在执行到任务后会进行SKIPPED(跳过))

类似使用onlyif{}方法(通过提前设置条件来判断是否执行)
在这里插入图片描述

任务规则(了解即可)

待补充
作用:目前只是知道用来处理一些异常情况
举例:
在使用tasks.findByName()方法时,如果任务不存在,则调用规则进行处理异常。

猜你喜欢

转载自blog.csdn.net/qq_35495763/article/details/86235835