Gradle系列之认识Gradle任务

原文发于微信公众号 jzman-blog,欢迎关注交流。

前面几篇学习了 Gradle 构建任务的基础知识,了解了 Project 和 Task 这两个概念,建议先阅读前面几篇文章:

Gradle系列之初识Gradle

Gradle之Groovy基础篇

Gradle系列之构建脚本基础

Gradle 的构建工作是有一系列的 Task 来完成的,本文将针对 Task 进行详细介绍,本文主要内容如下:

多种方式创建任务

多种方式访问任务

任务分组和描述

操作符

任务的执行分析

任务排序

任务的启用和禁用

任务的onlyIf断言

任务规则

多种方式创建任务

Gradle 中可以使用多种方式来创建任务,多种创建任务的方式最终反映在 Project 提供的快捷方法以及内置的 TaskContainer 提供的 create 方法,下面是几种常见的创建任务的方式:

/** * 第一种创建任务方式: * 方法原型:Task task(String name) throws InvalidUserDataException; */ //定义Task变量接收task()方法创建的Task,方法配置创建的Task def Task taskA = task(taskA) //配置创建的Task taskA.doFirst { println "第一种创建任务的方式" } /**task * 第二种创建任务方式:可在Map参数中进行相关配置,如依赖、任务描述、组别等 * 方法原型:Task task(Map<String, ?> args, String name) throws InvalidUserDataException; */ def Task taskB = task(group: BasePlugin.BUILD_GROUP,taskB,description: "描述") //配置创建的Task taskB.doLast { println "第二种创建任务的方式" println "任务taskB分组:${taskB.group}" println "任务taskB描述:${taskB.description}" } /** * 第三种创建任务方式:通过闭包的方式创建Task,闭包里的委托对象就是Task,即可在闭包内调用Task * 的一切属性和方法来进行Task的配置 * 方法原型:Task task(String name, Closure configureClosure); */ task taskC{ description 'taskC的描述' group BasePlugin.BUILD_GROUP doFirst{ println "第三种创建任务的方式" println "任务taskC分组:${group}" println "任务taskC描述:${description}" } } /** * 第四种创建任务的方式:可在闭包中灵活配置,也可在Map参数中配置,闭包中中的配置父覆盖Map中相同的配置 * 方法原型:Task task(Map<String, ?> args, String name, Closure configureClosure); */ def Task taskD = task(group: BasePlugin.BUILD_GROUP,taskD,description: "描述"){ description 'taskD的描述' group BasePlugin.UPLOAD_GROUP doFirst{ println "第四种创建任务的方式" println "任务taskD分组:${group}" println "任务taskD描述:${description}" } }

上面是创建任务的四种方式,使用时选择合适的创建方式即可,上面提到 Map 中可以配置 Task 的相关参数,下面是是 Map 中可使用的配置:

type:基于一个已存在的Task来创建,类似于类的继承,默认值DefaultTask overwrite:是否替换存在的Task,一般和type配合使用,默认值false dependsOn:配置当前任务的依赖,默认值[] action:添加到任务中的一个Action或者是一个闭包,默认值为null description:任务描述,默认值null group:任务分组,默认值null

通过闭包的方式创建 Task,闭包里的委托对象就是 Task,即可在闭包内调用 Task
的一切属性和方法来进行 Task 的配置,可以说使用闭包的这种任务创建方式更灵活,此外还可以使用 TaskContainer 创建任务,参考如下:

//使用TaskContainer创建任务的方式 tasks.create("taskE"){ description 'taskE的描述' group BasePlugin.BUILD_GROUP doFirst{ println "第三种创建任务的方式" println "任务taskE分组:${group}" println "任务taskE描述:${description}" } }

tasks 是 Project 的属性,其类型是 TaskContainer,所以可以通过 tasks 来创建任务,当然 TaskContainer 创建任务也有创建任务的其他构造方法,到此关于任务的创建就基本介绍完了。

多种方式访问任务

创建的任务(Task)属于项目(Project)的一个属性,其属性名就是任务名,该属性的类型是 Task,如果已知任务名称,那么可以通过任务名直接访问和操纵该任务了,也可以理解访问和操纵该任务所对应的 Task 对象,参考
如下:

/** * 访问任务的第一种方式:Task名称.doLast{} */ task taskF{ } taskF.doLast{ println "第一种访问任务的方式" }

任务都是通过 TaskContainer 的 create 方法创建的,而 TaskContainer 是创建任务的集合,在 Project 中可通过 tasks 属性访问 TaskContainer ,tasks 的类型就是 TaskContainer,所以对于已经创建的任务可通过访问几何元素的方式访问已创建任务的属性和方法,参考代码如下:

/** * 访问任务的第二种方式:使用TaskContainer访问任务 */ task taskG{ } tasks['taskG'].doLast { println "第二种访问任务的方式" }

Groovy 中 [] 也是一个操作符,上面 tasks['taskG'] 的真正含义是 tasks.getAt('taskG') , getAt() 方法在 TaskCollection 中的方法,这样可以通过任务名称对相关任务进行访问和操作。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdfsw.html