1、Gradle介绍
简单的说,Gradle就是用来构建项目的一个工具。
- 基于JVM
- 像Ant一样通用灵活
- 像Maven一样约定优于配置
- 支持多工程构建
- 强大的依赖管理(基于Apache Ivy)
- 对已有的maven和ivy仓库全面支持
- 支持传递性依赖管理,在不需要远程仓库和pom.xml和ivy配置文件的前提下
- 基于groovy脚本构建,其build脚本使用groovy语言编写
2、Ant、Maven、Gradle比较
创世之初,世上只有Make一种构建工具,后来,其发展为GNU Make。后来由于技术的不断发展,JVM生态圈里出现了三个最流行的构建工具:
-
Ant
Ant是第一个“现代”构建工具,在很多方面它有些像Make。
Ant的优点是上手比较快,对构建过程的控制直观透明。
Ant的不足在于使用XML作为脚本编写格式,XML本质是层次化的,并不能很好地贴合Ant过程化编程的初衷,在Ant里要表达一个if分支持功能非常的麻烦;项目一大起来,XML文件很快大的无法管理。
Ant一开始没有通过网络进行依赖管理的功能,直到采用了Apache Ivy。 -
Maven
Maven主要聚焦于依赖管理,实际上用Maven很难写出复杂、定制化的构建脚本,甚至不如Ant。
用XML写的配置文件会变得越来越大,越来越笨重。
Maven的主要优点是生命周期。只要项目基于一定之规,它的整个生命周期都能够轻松搞定,代价是牺牲了灵活性。 -
Gradle
Gradle结合了前两者的优点,在此基础之上做了很多改进。它具有Ant的强大和灵活,又有Maven的生命周期管理且易于使用。
Gradle不用XML,它使用基于Groovy的专门的DSL,从而使Gradle构建脚本变得比用Ant和Maven写的要简洁清晰。
它使用Apache Ivy来处理Jar包的依赖。
Gradle的成就可以概括为:约定好,灵活性也高。
3、Gradle相关的文件
-
settings.gradle
这个文件是用来告诉gradle工具你的工程包含了几个模块。
示例:include ':app',':library'
你可以指定模块的路径。
示例:project(':app').projectDir = new File('path')
-
gradle-wrapper.properties
这个文件位于工程根目录下的build/wrapper
目录下,通过修改gradle-wrapper.properties
文件中的distributionUrl
,可以指定需要下载的gradle版本;
下载的功能是通过另外一个文件gradle-wrapper.jar
完成的。 -
gradle.properties
一个配置文件,里面可以定义一些常量。 -
gradlew和gradlew.bat
分别是linux下的shell脚本和windows下的批处理文件,它们的作用是根据gradle-wrapper.properties文件中的distributionUrl下载对应的gradle版本。这样就可以保证在不同的环境下构建时都是使用的统一版本的gradle,即使该环境没有安装gradle也可以,因为gradle wrapper会自动下载对应的gradle版本。 -
build.gradle
进行工程打包的一些配置,这里就不赘述了。
4、Gradle任务
1. 创建一个任务
task helloTask{
println '在这里进行任务配置'
doFirst{
println '任务执行前做的事'
}
doLast{
println '任务执行后做的事'
}
}
2. 任务依赖
假设现在我们已经创建好了TaskA、TaskB、TaskC。
- dependsOn
TaskC dependsOn TaskA, TaskB
这里表示TaskA和TaskB会先执行,然后再执行任务TaskC。
- shouldRunAfter
TaskA和TaskB哪个先执行是不一定的。
taskB.shouldRunAfter TaskA
taskA先于TaskB执行。
- finalizedBy
我们再新建一个任务TaskD。
taskC finalizedBy TaskD
当我们执行任务taskC时,任务的执行顺序是TaskA->TaskB->TaskC->TaskD。
5、Gradle生命周期
先读取settings.gradle
,然后是顶层的build.gradle
,最后是各个模块的build.gradle
。
project.beforeEvaluate {
println '在读取build.gradle文件前'
}
project.afterEvaluate {
println '在读取build.gradle文件后'
}
project.getGradle().addBuildListener(new BuildListener() {
@Override
void buildStarted(Gradle gradle) {
println '构建开始时'
}
@Override
void settingsEvaluated(Settings settings) {
println '读取settings.gradle的时候'
}
@Override
void projectsLoaded(Gradle gradle) {
println '模块加载时'
}
@Override
void projectsEvaluated(Gradle gradle) {
println '读取模块配置时'
}
@Override
void buildFinished(BuildResult buildResult) {
println '构建完成时'
}
})