写点什么

Gradle 入门基础一

作者:派大星
  • 2022-12-07
    辽宁
  • 本文字数:2760 字

    阅读完需:约 9 分钟

Gradle 生命周期

Initialization、Configuration、Execution
复制代码


具体职责如下:



  • Initialization 阶段主要目的是初始化构建, 它又分为两个子过程,一个是执行 Init Script,另一个是执行 Setting Script。

  • init.gradle文件会在每个项目 build 之前被调用,用于做一些初始化的操作,它主要有如下作用:

  • 配置内部的仓库信息(如公司的 maven 仓库信息);

  • 配置一些全局属性;

  • 配置用户名及密码信息(如公司仓库的用户名和密码信息)。

  • Setting Script 则更重要, 它初始化了一次构建所参与的所有模块。

  • Configuration 阶段:这个阶段开始加载项目中所有模块的 Build Script。所谓 "加载" 就是执行


build.gradle 中的语句, 根据脚本代码创建对应的 task, 最终根据所有 task 生成由 Task 组成的有向无环图(Directed Acyclic Graphs),如下:



从而构成如下有向无环树:



  • Execution 阶段:这个阶段会根据上个阶段构建好的有向无环图,按着顺序执行 Task【Action 动作】

Setting 文件

主要作用:


  • 主要是在项目初始化阶段确定一下引入哪些工程需要加入到项目构建中,为构建项目工程树做准备。

  • 工程树:gradle 中有工程树的概念,类似于 maven 中的 project 与 module。


内容:


  • 里面主要定义了当前 gradle 项目及子 project 的项目名称

  • 必须放在根工程目录下,并且有且只有一个 settings 文件

  • settings.gradle 文件,名字不能发生变化

  • 对应实例:与 org.gradle.api.initialization.Settings 实例是一一对应的关系。每个项目只有一个 settings 文件。

  • 作为开发者我们只需要关注该文件中的 include 方法即可。使用相对路径【 : 】引入子工程。

  • 一个子工程只有在 setting 文件中配置了才会被 gradle 识别,这样在构建的时候才会被包含进去。案例如下所示:


//根工程项目名rootProject.name = 'root'//包含的子工程名称 在不引起歧义的情况下可以 () 去掉include ('subject01') // 使用 : 也可以例如下面 :的意思是当前项目目录下的subject02include ':subject02' include 'subject03'//包含的子工程下的子工程名称include 'subject01:subproject011' include 'subject01:subproject012'
复制代码


项目名称中 ":" 代表项目的分隔符, 类似路径中的 "/". 如果**以 ":" 开头则表示相对于 root project。**然后 Gradle 会为每个带有 build.gradle 脚本文件的工程构建一个与之对应的 Project 对象。

Gradle 对测试的支持

Junit 的使用

Gradle 对 Junit 4 的支持

dependencies {    testImplementation group: 'junit' ,name: 'junit', version: '4.12'}// test {//     useJUnit()// }
复制代码

Gradle 对 Junit 5 的支持

dependencies {    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'     testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'}test {    // 支持Junit 5测试    useJUnitPlatform()}
复制代码

包含和排除特定测试

test {    // 跳过测试    enabled false     useJUnit()         include 'com/**'    exclude 'com/abc/**'}
复制代码

Task

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


官方文档:https://docs.gradle.org/current/userguide/tutorial_using_tasks.html


demo:


task A {    // 任务的配置段,在配置阶段执行    println "root taskA"     // 任务的行为:在执行阶段执行,doFirst会在doLast之前执行    doFirst(){        println "root taskA doFirst"    }    doLast(){        println "root taskA 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}
复制代码

底层原理分析

无论是定义任务自身的 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!'}
复制代码

常用命令


gradle.properties
复制代码



详细命令可参考官方文档:https://docs.gradle.org/current/userguide/command_line_interface.html


拓展:


gradle 任务名是缩写: 任务名支持驼峰式命名风格的任务名缩写,如:connectTask 简写为:cT,执行任务 gradle cT。


前面提到的 Gradle 指令本质:一个个的 task[任务], Gradle 中所有操作都是基于任务完成的。


gradle 默认各指令之间相互的依赖关系:



图中相关命令的解释:


task 的定义方式

  • 一种是通过 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  "}
复制代码


  • Task 的属性



demo:


Task 的类型


参看官方地址:https://docs.gradle.org/current/dsl/index.html



整理不易。欢迎点赞关注


微信搜索【码上遇见你】获取 Java 学习资料。获取更多精彩内容。

用户头像

派大星

关注

微信搜索【码上遇见你】,获取更多精彩内容 2021-12-13 加入

微信搜索【码上遇见你】,获取更多精彩内容

评论

发布
暂无评论
Gradle入门基础一_Gradle_派大星_InfoQ写作社区