开发者社区> 君哥聊编程> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介: 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每一个版本都有对生命周期进行变更,大家只需要掌握几个核心的方法和步骤即可。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Gradle从0入门到实战系列【五】工程化之插件
插件可以封装一系列任务,例如 编译,测试,打包等。 IDEA、VsCode、Eclipse、Maven、Chrome等都是支持插件集成的工具。插件意味着扩展,Gradle只要定义好插件规范,各大厂商或个人开发者遵循这个规范就能开发出很多有用的插件,从而丰富Gradle生态。
0 0
第三章 Gradle构建脚本基础
从这章开始,会对Gradle有一个大概的介绍,帮助大家快速的入门Gradle。本章从整体构建脚本的角度介绍Gradle,什么是Settings文件,他有什么作用;什么是Build文件,它又有什么作用,我们可以新建多少Build文件。
0 0
Maven 构建生命周期和插件简介
Maven 构建生命周期定义了一个项目构建跟发布的过程。 Maven defines 3 lifecycles in META-INF/plexus/components.xml。 一个典型的 Maven 构建(build)生命周期是由以下几个阶段的序列组成的: 。
0 0
实操 | 基于 SOFABoot 进行模块化开发
SOFA 中间件是蚂蚁金服自主研发的金融级分布式中间件,包含了构建金融级云原生架构所需的各个组件,包括微服务研发框架,RPC 框架,服务注册中心,分布式定时任务,限流/熔断框架,动态配置推送,分布式链路追踪,Metrics监控度量,分布式高可用消息队列,分布式事务框架,分布式数据库代理层等组件。
294 0
gradle_学习_02_gradle多模块构建实例
一、前言     二、多模块构建 1.工程结构    父工程:weixin-service 子模块:weixin-gz                weixin-qy   2.
711 0
Gradle学习之基础篇
一。gradle基础概念 Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化构建工具。Gradle抛弃了基于各种繁琐的XML,使用一种基于Groovy的特定领域语言(DSL)来声明项目设置。
1606 0
Gradle 1.12用户指南翻译——第五十五章. 构建的生命周期
其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上的地址:https://github.com/msdx/gradledoc本文翻译所在分支:https://github.com/msdx/gradledoc/tree/1.12。
866 0
Gradle笔记——依赖管理基础
1. 什么是依赖管理 依赖管理可以分为两部分:一是依赖,即项目构建或运行时所需要的一些文件;二是发布,即构建完成后上传到某个地方。 1.1 依赖 大部分的项目都需要第三方库类或项目文件,这些文件就是项目的依赖了。
792 0
Gradle笔记——构建基础
本篇文章主要介绍一下Gradle的构建基础。它看起来似乎和android项目没多大关系,不能让人一下子理解android项目中的Gradle配置文件,但是这篇基础真的很重要。 学习Gradle前,需要有一个Groovy语言的基础,以免被Groovy的语法困扰,反而忽略了Gradle的知识。
663 0
+关注
君哥聊编程
多年一线资深coder,性能调优小哥
文章
问答
文章排行榜
最热
最新
相关电子书
更多
ReactNative实战优化之路
立即下载
使用Spring.Initializr定制工程脚手架
立即下载
陈曦:使用Spring.Initializr定制工程脚手架
立即下载