Task
项目实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译Java 源代码,拷贝文件, 打包Jar 文件,甚至可以是执行一个系统命令。另外,一个 Task 可以读取和设置Project 的Property 以完成特定的操作。
任务入门
让我们来先看一个例子:
task A { println "root taskA" doFirst(){ println "root taskA doFirst" } doLast(){ println "root taskA doLast" } }
在文件所在的目录执行命令: gradle A。
提示 1 :task 的配置段是在配置阶段完成
提示 2 :task 的doFirst、doLast 方法是执行阶段完成,并且doFirst 在doLast 执行之前执行。
提示 3:区分任务的配置段和任务的行为,任务的配置段在配置阶段执行,任务的行为在执行阶段执行
任务的行为
案例如下:doFirst、doLast 两个方法可以在任务内部定义,也可以在任务外部定义
def map=new HashMap<String,Object>(); //action属性可以设置为闭包,设置task自身的行为 map.put("action",{println "taskD.."}) task(map,"a"){ description 'taskA description ' group "onenewcode" //在task内部定义doFirst、doLast行为 doFirst { def name = 'doFirst..' println name } doLast { def name = 'doLast..' println name } } //在task外部定义doFirst、doLast行为 a.doFirst { println it.description } a.doLast { println it.group }
测试:gradle a , 输出如下所示:
底层原理分析:无论是定义任务自身的 action,还是添加的doLast、doFirst 方法,其实底层都被放入到一个Action 的List 中了,最初这个 action List 是空的,当我们设置了 action【任务自身的行为】,它先将action 添加到列表中,此时列表中只有一个action,后续执行doFirst 的时候doFirst 在action 前面添加,执行 doLast 的时候doLast 在action 后面添加。doFirst 永远添加在actions List 的第一位,保证添加的Action 在现有的 action List 元素的最前面;doLast 永远都是在action List 末尾添加,保证其添加的Action 在现有的action List 元素的最后面。一个往前面添加,一个往后面添加,最后这个action List 就按顺序形成了doFirst、doSelf、doLast 三部分的 Actions,就达到 doFirst、doSelf、doLast 三部分的 Actions 顺序执行的目的。
任务的依赖方式
Task 之间的依赖关系可以在以下几部分设置:
- 参数依赖
- 内部依赖
- 外部依赖
方式一:参数方式依赖
task A { doLast { println "TaskA.." } } task 'B' { doLast { println "TaskB.." } } //参数方式依赖: dependsOn后面用冒号 task 'C'(dependsOn: ['A', 'B']) { doLast { println "TaskC.." } }
方式二:内部依赖
//参数方式依赖 task 'C' { //内部依赖:dependsOn后面用 = 号 dependsOn= [A,B] doLast { println "TaskC.." } }
方式三:外部依赖
//外部依赖:可变参数,引号可加可不加
C.dependsOn(B,‘A’)
当然:task 也支持跨项目依赖
在subproject01 工程的 build.gradle 文件中定义:
task A { doLast { println "TaskA.." } }
在subproject02 工程的 build.gradle 文件中定义:
task B{ dependsOn(":subproject01:A") //依赖根工程下的subject01中的任务A :跨项目依赖。 doLast { println "TaskB.." } }
测试:gradle B ,控制台显示如下
拓展 1:当一个 Task 依赖多个Task 的时候,被依赖的Task 之间如果没有依赖关系,那么它们的执行顺序是随机的,并无影响。
拓展 2:重复依赖的任务只会执行一次,比如:
A->B、C
B->C
任务A 依赖任务 B 和任务 C、任务 B 依赖C 任务。执行任务A 的时候,显然任务C 被重复依赖了,C 只会执行一次。
任务执行
任务执行语法:gradle [taskName…] [–option-name…]。
常见的任务(*)
gradle build: 构建项目:编译、测试、打包等操作
gradle run :运行一个服务,需要application 插件支持,并且指定了主启动类才能运行
gradle clean: 请求当前项目的 build 目录 gradle init : 初始化 gradle 项目使用
gradle wrapper:生成wrapper 文件夹的。
- gradle wrapper 升级wrapper 版本号:gradle wrapper --gradle-version=4.4
- gradle wrapper --gradle-version 5.2.1 --distribution-type all :关联源码用|
项目报告相关任务
- gradle projects : 列出所选项目及子项目列表,以层次结构的形式显示
- gradle tasks: 列出所选项目【当前 project,不包含父、子】的已分配给任务组的那些任务。
- gradle tasks --all :列出所选项目的所有任务。
- gradle tasks --group=“build setup”:列出所选项目中指定分组中的任务。
- gradle help --task someTask :显示某个任务的详细信息
- gradle dependencies :查看整个项目的依赖信息,以依赖树的方式显示
- gradle properties 列出所选项目的属性列表|
调试相关选项
-h,–help: 查看帮助信息
-v, --version:打印 Gradle、 Groovy、 Ant、 JVM 和操作系统版本信息。
-S, --full-stacktrace:打印出所有异常的完整(非常详细)堆栈跟踪信息。
-s,–stacktrace: 打印出用户异常的堆栈跟踪(例如编译错误)。
-Dorg.gradle.daemon.debug=true: 调试 Gradle 守护进程。
-Dorg.gradle.debug=true:调试 Gradle 客户端(非 daemon)进程。
-Dorg.gradle.debug.port=(port number):指定启用调试时要侦听的端口号。默认值为 5005。
性能选项
–build-cache, --no-build-cache: 尝试重用先前版本的输出。默认关闭(off)。
–max-workers: 设置 Gradle 可以使用的woker 数。默认值是处理器数。
-parallel, --no-parallel: 并行执行项目。
守护进程选项
–daemon, --no-daemon: 使用 Gradle 守护进程运行构建。默认是on
–foreground:在前台进程中启动 Gradle 守护进程。
-Dorg.gradle.daemon.idletimeout=(number of milliseconds):
Gradle Daemon 将在这个空闲时间的毫秒数之后停止自己。默认值为 10800000(3 小时)。
日志选项
-Dorg.gradle.logging.level=(quiet,warn,lifecycle,info,debug):
通过 Gradle 属性设置日志记录级别。
-q, --quiet: 只能记录错误信息
-w, --warn: 设置日志级别为 warn
-i, --info: 将日志级别设置为 info
-d, --debug:登录调试模式(包括正常的堆栈跟踪)
其它(*)
-x:-x 等价于: --exclude-task : 常见gradle -x test clean build
–rerun-tasks: 强制执行任务,忽略up-to-date ,常见gradle build --rerun-tasks
–continue: 忽略前面失败的任务,继续执行,而不是在遇到第一个失败时立即停止执行。每个遇到的故障都将在构建结束时报告,常见:gradle build --continue。
gradle init --type pom :将maven 项目转换为gradle 项目(根目录执行)
gradle [taskName] :执行自定义任务
拓展:gradle 任务名是缩写: 任务名支持驼峰式命名风格的任务名缩写,如:connectTask 简写为:cT,执行任务 gradle cT。
拓展 1:前面提到的Gradle 指令本质:一个个的task[任务], Gradle 中所有操作都是基于任务完成的。
拓展 2:gradle 默认各指令之间相互的依赖关系:
相关解释:
任务定义方式
任务定义方式,总体分为两大类:一种是通过 Project 中的task()方法,另一种是通过tasks 对象的 create 或者register 方法。
task('A',{//任务名称,闭包都作为参数println "taskA..." }) task('B'){//闭包作为最后一个参数可以直接从括号中拿出来println "taskB..." } task C{//groovy语法支持省略方法括号:上面三种本质是一种println "taskC..." } def map=new HashMap<String,Object>(); map.put("action",{println "taskD.."}) //action属性可以设置为闭包task(map,"D"); tasks.create('E'){//使用tasks的create方法println "taskE.." } tasks.register('f'){ //注:register执行的是延迟创建。也即只有当task被需要使用的时候才会被创建。 println "taskF " }
Gradle笔记 四 Gradle的核心 TASK(二)https://developer.aliyun.com/article/1391967