Gradle从0入门到实战系列【六】生命周期剖析

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Gradle的核心是一种基于依赖的编程语言,任务与任务之间有一定的依赖关系,并且每个任务只会执行一次。在构建时,Gradle会把这些任务串联起来形成有向无环图。那Gradle是在什么时候进行串联的呢?这就需要充分了解Gradle在各个阶段做了什么事情了,从一开始到结束的这一连串动作我们称为生命周期。

构建的阶段

gradle构建有3个不同的阶段

  1. 初始化: gradle支持单项目和多项目构建,在该阶段,gradle会解析setting.gradle文件,确定哪些项目需要参与构建,并且为这些项目创建一个Project实例
  2. 配置:当完成初始化阶段后,就会进入配置阶段,配置阶段解析所有project中的build.gradle文件获取所有的task,形成有向无环图后执行依赖关系,并且所有project中的build script部分和task的配置段会在这一阶段调用(注意并不是执行具体的task代码)。
  3. 执行task: 当完成任务依赖图后, Gradle 就做好了一切准备,然后进入执行阶段。按照有向无环图中task列表的顺序,执行所有被指定的task

gradle在生命周期三个阶段都设置了相应的钩子函数调用。

初始化阶段

image.png

//settings.gradle
gradle.beforeSettings {
    //Gradle.buildStarted()在6.0中弃用,7.0中彻底删除,采用beforeSettings替代
    println '在settings加载之前执行,但是这个函数又放在了settings中,所以不会执行'
}
gradle.settingsEvaluated {
    println 'settings脚本执行完成之后调用'
}
//每个module的build.gradle执行之前都会调用,闭包会传入当前的project对象作为参数
gradle.projectsLoaded {
    println "所有的project对象加载完成"
}

//上述的写法也可以采用如下方式书写
gradle.addBuildListener(new BuildListener() {
    @Override
    void beforeSettings(Settings settings) {
        super.beforeSettings(settings)
    }
    
    @Override
    void settingsEvaluated(Settings settings) {}

    @Override
    void projectsLoaded(Gradle gradle) {}
})

配置阶段

image.png

//settings.gradle
//每个module的build.gradle执行之前都会调用,闭包会传入当前的project对象作为参数
//注意:如果在build.gradle中书写project.beforeProject闭包并不会执行(子模块的情况另说),参照gradle.beforeSettings函数
gradle.beforeProject{ project ->
    println 'beforeProject $project'
}
gradle.afterProject{ project ->
    println 'afterProject $project'
}

//所有module的build.gradle脚本执行完成之后,表示build.gradle执行完成
gradle.projectsEvaluated {
    println 'projectsEvaluated'
}

// task有向无环图构建完成,配置阶段完成,TaskExecutionGraph对象作为对象传入闭包
gradle.taskGraph.whenReady { graph ->
    println 'whenReady'
}
// 同gradle.taskGraph.whenReady
gradle.addListener(new TaskExecutionGraphListener() {
    @Override
    void graphPopulated(TaskExecutionGraph taskExecutionGraph) {
        println "TaskExecutionGraphListener.graphPopulated"
    }
})
//project.beforeEvaluate的执行时机
public class DemoPlugin implements Plugin<Project> {
    @Override
    public void apply(Project project) {
        project.beforeEvaluate {
            println("beforeEvaluate")
        }
    }
}
//如果这个DemoPlugin是被写在`build.gradle`文件里,像这样`apply plugin: 'demoPlugin'`,`beforeEvaluate()`方法不会执行,而如果是在rootPlugin里,调用subProject的`apply plugin 'demoPlugin'`,则`beforeEvaluate()`会被执行。原因是`beforeEvaluate()`这个方法是在解析`build.gradle`文件之前执行,在`build.gradle`中才注册`beforeEvaluate()`监听方法,已经晚了。

基于此,我们想在解析`build.gradle`之前,改变`build.gradle`文件的内容,可以在
beforeEvaluate() 这个方法里修改`build.gradle`。

执行阶段

image.png

//settings.gradle
gradle.taskGraph.beforeTask {
    //7.3已过时,8.0中将删除
}

gradle.taskGraph.afterTask {
    //7.3已过时,8.0中将删除
}

//或者如下写法
gradle.addListener(new TaskActionListener() {
    @Override
    void beforeActions(Task task) {
    }
    @Override
    void afterActions(Task task) {
    }
})

官方关于过时API的说明如下,意思是不再直接支持访问Task和Project相关的监听,后面迭代的重点在配置缓存,但在目前版本中配置缓存默认未开启,具体用法还没有研究

image.png

总结

本篇我们对Gradle生命周期的执行流程进行了分析,需要大家将代码贴入到项目中才能看到实际效果,Gradle每一个版本都有对生命周期进行变更,大家只需要掌握几个核心的方法和步骤即可。

目录
相关文章
|
5月前
|
XML Java 测试技术
Gradle安装部署与基础入门详解
Gradle安装部署与基础入门详解
687 0
|
Java 测试技术 Spring
Gradle从0入门到实战系列【八】SpringBoot集成Junit单元测试
JUnit 是一个 Java 编程语言的单元测试框架。JUnit 在测试驱动的开发方面有很重要的发展,是起源于 JUnit 的一个统称为 xUnit 的单元测试框架之一。
1563 1
Gradle从0入门到实战系列【八】SpringBoot集成Junit单元测试
|
5月前
|
XML 缓存 Java
Gradle 构建自动化工具入门
Gradle 构建自动化工具入门
|
XML Java Apache
Gradle极简入门
Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。它使用一种基于Groovy的特定领域语言(DSL)来声明项目设置,而不是传统的XML。Gradle构建脚本是用Groovy编写的,也可以使用Kotlin编写,两者都是基于JVM的语言。
304 0
|
Java 编译器 API
Gradle筑基篇(五)-Gradle自定义插件实战
前面几篇文章笔者对Gradle的一些基础认知,groovy基础语法,以及Gradle 项目中常用的一些api进行了讲解。今天笔者再来讲解一些关于`Gradle插件`的使用
|
Java Maven 数据安全/隐私保护
Gradle 项目的生命周期和settings文件
Gradle 项目的生命周期和settings文件
Gradle 项目的生命周期和settings文件
|
XML 存储 缓存
|
Java API 容器
【Deprecated】Gradle | 进阶篇(Project & Task & 构建生命周期)
【Deprecated】Gradle | 进阶篇(Project & Task & 构建生命周期)
474 0
【Deprecated】Gradle | 进阶篇(Project & Task & 构建生命周期)
|
弹性计算 Java jenkins
Gradle从0入门到实战系列【十】集成Dockerfile构建Docker镜像
在工作中,我们会将SpringBoot程序打包成Docker镜像,这就需要在Gradle中配置Dockerfile构建程序,并且能将打包后的镜像部署并启动为一个容器,Gradle的插件能够帮我们完成这件事
1165 0
Gradle从0入门到实战系列【十】集成Dockerfile构建Docker镜像
|
缓存 Java Linux
Gradle从0入门到实战系列【九】仓库与私服
Gradle沿用了Maven仓库,在使用仓库时能够很友好的基于Maven仓库提供功能,但Gradle所产生的构建并不会提供给Maven仓库,因为Gradle自己拷贝了一份Maven本地仓库缓存到了自己仓库目录下。
1165 0
Gradle从0入门到实战系列【九】仓库与私服