Gradle生命周期
来源:互联网 发布:金十数据交易英雄 编辑:程序博客网 时间:2024/06/05 02:46
Gradle与Maven有一个很大的区别是Gradle构建生命周期分三个阶段:
- 初始化阶段:负责判断有多少个Projects参与构建。
- 配置阶段:负责对初始化阶段创建的Projects完成配置。
- 执行阶段:根据配置阶段的配置执行任务。
初始化阶段
构建初始化阶段首先寻找一个叫settings.gradle的文件,检查是否当前构建是否是多项目构建,并负责创建项目树。在多项目构建中,settings.gradle是必需的,因为这个文件定义了参与构建的项目。
可以看出,settings.gradle中的代码最先执行,所以理论上还可以做其他事情。
而在没有settings.gradle文件的项目中,如果执行构建,则Gradle按这个顺序查找settings.gradle:
- 从当前目录的master文件夹内寻找。
- 如果master目录中也没有,则搜索父目录。
- 如果父目录也没找到,则把构建当成单个项目构建。
- 如果找到了,并且发现当前项目是多项目构建的一部分,则执行多项目构建。没找到,则执行单项目构建。
从第二步中可以看出,Gradle支持从子项目中触发构建父项目。如果不想从子项目触发父项目,而只是做单项目构建,则应该在gradle命令后加上-u命令行选项。
配置阶段
配置阶段负责对初始化阶段创建的projects做一些配置,比如添加Task,修改Task的行为等。
执行阶段
有些同学可能认为如果项目中没有默认任务,那么Gradle什么也不做,其实不是这样的。即使没有在项目中配置默认任务,构建依然需要经过初始化阶段和配置阶段。也就是和说,如果在配置阶段和初始化阶段有行为发生的话,那些行为还是会发生。
println 'This is executed during the configuration phase.'task configured { println 'This is alsoexecuted during the configuration phase.'}task test << { println 'This is executedduring the execution phase.'}
比如上面这个构建,直接运行gradle的结果:
> gradleThis is executed during the configuration phase.This is also executed during the configuration phase.
构建通知
在构建的生命周期中的很多阶段,Gradle会发布一些通知,表明某些事情将要发生或已经发生了。监听这些通知,我们可以在这些阶段做一些额外的事情。
项目评估前或评估后
初始化阶段之后,接着就是执行build.gradle对Project对象做配置,比如添加Task等。配置从项目树的根节点开始,按照广度优先的顺序执行,所以父项目一定比子项目先评估。
Project有对应的beforeEvaludate和afterEvaludate方法。
比如项目评估后:
allprojects { afterEvaluate { project,projectState -> if(project.hasTests) { println"Adding test task to $project" project.task('test')<< { println"Running tests for $project" } } }}
除了Project.afterEvaludate,还有gradle.afterProject()也可以:
gradle.afterProject {project, projectState -> if(projectState.failure) { println"Evaluation of $project FAILED" } else { println"Evaluation of $project succeeded" }}
项目创建之后,保存在gradle中,所以得通过gradle.afterProject调用。
Project.afterEvaludate()和afterProject的区别和联系:
- afterProject比Project.afterEvaludate()先执行。
- Project.afterEvaludate()只监听当前项目,afterProject监听所有项目。
- 无论成功还是失败,afterProject和Project.afterEvaludate()都会执行。
任务创建后
tasks.whenTaskAdded { task -> if (task.name == 'a') { task.ext.srcDir ='src/main/java' } }
在配置阶段任务完成创建,然后加入Project中,所以需要通过tasks来监听。Tasks是项目的属性,也是该项目所有任务的集合。
任务蓝图准备好后
gradle.taskGraph.whenReady {taskGraph -> if(taskGraph.hasTask(release)) { version = '1.0' } else { version ='1.0-SNAPSHOT' }}
任务蓝图是指任务的执行计划,蓝图中的任务就是需要执行的任务。任务蓝图是Gralde的属性,不是项目的属性,所以通过gradle.taskGraph应用。
任务执行前或执行后
gradle.taskGraph.beforeTask { Task task -> println "executing$task ..."}gradle.taskGraph.afterTask { Task task, TaskState state -> if (state.failure) { println"FAILED" } else { println"done" }}
只有任务蓝图中的任务才会执行,所以要监听任务执行前和执行后,则同样只能在任务蓝图上添加监听。
注意:无论任务是否执行成功,afterTask都会执行。
- gradle生命周期
- Gradle生命周期
- gradle 生命周期
- Gradle生命周期
- 七.gradle的构建生命周期
- Gradle
- gradle
- gradle
- gradle
- gradle
- Gradle
- gradle
- gradle
- gradle
- Gradle
- Gradle
- gradle
- Gradle
- popupwindow的基本使用以及基本动画效果
- Android Stodio问题记录
- Javascript-网页了解
- Spring Boot学习笔记
- android使用icon font字体代替图片
- Gradle生命周期
- Android性能优化之如何避免Overdraw
- PCL和MFC的融合
- 使用delete释放new[]的空间造成的错误分析
- Neo4j数据建模优化:双向关系
- 项目的架构分析
- 阿里百川HotFix的使用
- SOA理解
- SSH服务器,只为卸下重负