Gradle 中的Task(上)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Gradle 中的Task

项目实质上是 Task 对象的集合。一个 Task 表示一个逻辑上较为独立的执行过程,比如编译 Java 源代码,拷贝文件, 打包 Jar 文件,甚至可以是执行一个系统命令。另外,一个 Task 可以读取和设置 Project 的 Property 以完成特定的操作。


1. 简介


参考文档


例子:

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: 区分任务的配置段和任务的行为 ,任务的配置段在 配置阶段执行 ,任务的行为在 执行阶段执行


2. 任务的行为


案例如下:doFirst、doLast 两个方法可以 在任务内部定义,也可以在任务外部定义

def map=new HashMap<String,Object>(); 
//action属性可以设置为闭包,设置task自身的行为 
map.put("action",{println "taskD.."}) 
task(map,"a"){ 
    description 'taskA description....' 
    group "atguigu" 
    //在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 , 输出如下所示:

1673441582678.jpg

底层原理分析:无论是定义任务自身的 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 顺序执 行的目的。


提示 1: 其中<<代表 doLast,在 gradle5.x 版本之后就废弃,不能使用了,如下所示:


如下所示:

task hello << { 
    println 'Hello world!' 
}


3. 任务的依赖方式


Task 之间的依赖关系可以在以下几部分设置:


1.参数依赖

2.内部依赖

3.外部依赖


方式一:参数方式依赖

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.." 
    } 
}


测试: gradle C


方式三:外部依赖

//外部依赖:可变参数,引号可加可不加 
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 ,控制台显示如下

1673441654934.jpg

总结:

当一个 Task 依赖多个 Task 的时候,被依赖的 Task 之间如果没有依赖关系,那么它们的执行顺序是随机的,并 无影响。


重复依赖的任务只会执行一次 ,比如:


A → B、C

B → C


任务 A 依赖任务 B 和任务 C、任务 B 依赖 C 任务。执行任务 A 的时候,显然任务 C 被重复依赖了,C 只会执行一次。


4. 任务执行


任务执行语法: 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。

性能选项:【备注:在 gradle.properties 中指 定这些选项中的许多 选项,因此不需要命 令行标志】

–build-cache, --no-build-cache: 尝试重用先前版本的输出。默认关闭(off)。

–max-workers: 设置 Gradle 可以使用的 woker 数。默认值是处理器数。

-parallel, --no-parallel: 并行执行项目。有关此选项的限制,请参阅并行项目执行。 默认设置为关闭(off)

守护进程选项

–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 默认各指令之间相互的依赖关系:

1673441852398.jpg

1673441862131.jpg


5. 任务定义方式


任务定义方式,总体分为两大类:一种是通过 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...." 
}


也可以在定义任务的同时指定任务的属性,具体属性有:

1673441485076.jpg

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
存储 Java 测试技术
Gradle笔记 四 Gradle的核心 TASK(二)
Gradle笔记 四 Gradle的核心 TASK
55 0
|
3月前
|
Java Maven
Gradle笔记 四 Gradle的核心 TASK(一)
Gradle笔记 四 Gradle的核心 TASK
61 0
|
存储 Java 测试技术
|
Java API 容器
【Deprecated】Gradle | 进阶篇(Project & Task & 构建生命周期)
【Deprecated】Gradle | 进阶篇(Project & Task & 构建生命周期)
455 0
【Deprecated】Gradle | 进阶篇(Project & Task & 构建生命周期)
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
380 0
首次运行Flutter失败报错(Finished with error: Gradle task assembleDebug failed with exit code 1)
|
Java 容器
Gradle从0入门到实战系列【四】build.gradle之Task
任务是gradle的最小执行单元,一个build.gradle是由一系列的task组成,重要性不言而喻,在前面课程中我们或多或少做了一些了解,接下来我们真正认识task。
452 0
Gradle从0入门到实战系列【四】build.gradle之Task
|
测试技术
gradle编译出错:Execution failed for task ':app:compileTestDebugJava'
版权声明:本文为博主原创文章,转载请标明出处。 https://blog.csdn.net/chaoyu168/article/details/50012843 随着更新gradle到1.12,出现问题。
1090 0
|
Java 容器
深入理解gradle中的task
深入理解gradle中的task
|
Java Shell API
Gradle API 以及Task
Gradle 编程框架 1.groovy语法 2.Build Script Block 3.gradle api 前言 1.灵活性上: ANT和Maven 不能在构建过程中,做自定义操作.
1525 0