项目构建工具Gradle详解

时间:2021-08-22 12:12:21

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 '构建完成时'
}
})