前言
随着业务需求变得越来越复杂,项目的规模也变得越来越大,项目越大包含的代码资源文件也就越多,而越大的项目往往需要越多的开发者共同维护,这种状态就导致即使是简单的构建目标对象文件也非常困难,于是就有了自动构建工具。早期的自动构建工具主要是Ant和Maven,不过Ant只是命令式配置执行,不容易维护和复用,Maven虽然有了插件化和依赖管理功能,但它的构建过程相对死板无法灵活配置,对于条件式的构建支持不够友好,鉴于它们存在的这些问题大牛们又开发出了Gradle构建工具。
Gradle执行阶段
阶段名称 | 阶段工作 |
---|---|
初始化阶段 | 解析整个工程中的所有Project,构建所有的Project对应的project对象 |
配置阶段 | 解析所有的projects对象中的task,构建好所有task的拓扑图 |
执行阶段 | 执行具体的task及其依赖task |
需要注意的是写在Gradle构建脚本中的代码分成两大类,配置代码和动作代码,动作代码是指Task接口中写在doFirst和doLast闭包里的代码,而除了动作代码之外的代码都是配置代码,配置代码会在配置阶段执行,动作代码在执行阶段才会执行。
监听接口
Gradle提供了构建生命周期钩子来支持执行构建过程中发生某件事情时用户想要执行逻辑,这种逻辑可以添加在构建阶段的之前、过程中和之后,可以使用Gradle提供的监听器接口来做处理。
监听接口 | 监听阶段 |
---|---|
project.beforeEvaluate() | 在配置阶段开始之前,初始化阶段和配置阶段之间的监听 |
project.afterEvaluate() | 在配置阶段之后,在执行阶段之前执行的监听 |
project.gradle.buildFinished { } | 在gradle生命周期完之后的监听 |
如果在build.gradle里设置beforeEvaluate会发现里面的代码根本没有被执行,这是因为在初始化阶段build.gradle文件中的代码根本不会被执行,执行build.gradle里的配置代码其实已经到了配置阶段,这种在配置阶段之前执行的代码可以放到~/.gradle/init.d文件夹下的文件里执行,这样的话这个执行脚本的代码就会成为本机所有工程都会执行的逻辑。
// ~/.gradle/init.d/project.gradle
gradle.projectsLoaded {
gradle -> gradle.rootProject.beforeEvaluate {
println "Root Project Before Evaluate"
}
}
$ gradle clean
Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF-8
> Configure project :
Root Project Before Evaluate
还可以通过addListener接口来添加监听事件
Gradle命令行
Gradle命令行主要是针对构建脚本中的task任务执行,常用的任务分为帮助类Task、构建设置类Task和构建Task。在实际工作中会经常用到帮助类Task来查看构建相关的信息。
帮助任务 | 任务用处 |
---|---|
gradle projects | 可以查看所有的项目树形结构 |
gradle properties | 列出项目中所有的属性,可以是Project对象提供,也可以使用户自定义属性 |
gradle tasks | 显示所有可运行的Task包括它们的描述信息 |
gradle buildEnvironment | 显示根项目构建脚本的依赖 |
gradle components | 该项目所有的Comoponent |
gradle dependencies | 项目的所有依赖 |
除了上面的命令行后面还可以添加选项,常用选项如下:
选项 | 意义 |
---|---|
-b buildfile | 不使用默认的build.gradle构建脚本使用buildfile脚本 |
–offline | 构建时不访问远程仓库,只使用本地仓库构建 |
–deamon | 使用后台线程执行任务,可以加速构建过程 |
–stop | 停止处于后台的构建任务线程 |
Project接口
Gradle里的根project负责管理所有内部的子project,而子project负责输出某个资源,