1. 简介

1.1 认识Gradle

Gradle 是一款开源的自动化构建工具,使用灵活且性能极佳,可以使用 Groovy 或者 Kotlin DSL 来编写构建脚本。从移动开发到微服务,从小团队到大企业,Gradle提高了开发人员的生产力。
Gradle 具有如下特性:

  • 可以高度定制:Gradle使用可定制、可扩展的方式进行建模,非常灵活。
  • 构建速度快:Gradle通过重用先前执行的输出,仅处理已更改的输入且通过并行执行任务来快速完成构建。
  • 功能强大:Gradle是Android的官方构建工具,并支持许多流行的语言和技术。

    1.2 安装Gradle

    1、首先需要下载 Gradle 的安装包,建议下载带源码的完整版本(否则 Gradle 中属性点进去不会有注释)下载地址:gradle.org/releases/
    2、添加 Gradle 环境变量。
    3、CMD 命令窗口输入 gradle -v,看看是否显示当前 Gradle 版本

    1.3 快速上手

    1、在工程文件夹下,创建一个 build.gradle 文件,内容如下:
    1. task hello{
    2. println 'Hello, Gradle!'
    3. }
    2、打开 cmd 终端,移动到工程目录下,执行命令:gradle -q hello,查看结果,执行成功并生成 .gradle 文件夹。
    image.png
    3、继续在这个命令窗口执行命令:gradle wrapper ,构建成功。
    image.png image.png

如图所示,这就是一个很标准的 gradle 工程目录结构:
gradlew 和 gradlew.bat 分别是 Linux 和 Windows 下的可执行脚本,具体业务逻辑是在 /gradle/wrapper/gradle-wrapper.jar 中实现,gradlew 最终还是使用 Java 执行这个 jar 包来执行相关的 Gradle 操作的。

1.4 配置文件gradle-wrapper.properties

内容如下:

distributionBase=GRADLE_USER_HOME # 下载的Gradle压缩包解压后存储的主目录
distributionPath=wrapper/dists # 相对于distributionBase的解压后的Gradle压缩包的路径
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip # Gradle发行版压缩包的下载地址 
zipStoreBase=GRADLE_USER_HOME #同distributionBase,只不过存放的是zip压缩包的
zipStorePath=wrapper/dists

GRADLE_USER_HOME:

  • 默认路径在~/.gradle/ ,不建议使用本地 maven 的 m2 替代,因为原本的 .gradle 目录下的模块分的很清晰,功能明确。
  • 如果启动时,指定参数,使用别的目录代替 GradleUserHome ,后果是每次构建需要重新下载插件与依赖到新的目录。
  • 默认情况下,gradle 运行时,除了和项目打交道,还有当前项目构建的全新的 GradleUserHome 目录,所有jar包都得重新下载

1.5 Gradle命令

  • gradlew -?/-h/-help:使用帮助。
  • gradlew tasks:查看所有可执行Tasks。
  • gradlew --refresh-dependencies assemble:强制刷新依赖。
  • gradlew cBC:等价与执行 Task cleanBuildCache,这种通过缩写名快速执行任务。
  • gradlew :app:dependencies:查找 app 工程依赖树。

    1.6 IDEA配置Gradle

    1、在 gradle 目录中新建 .gradle 文件夹,在该文件夹中创建 init.gradle 文件。
    allprojects {
      repositories {
          def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public'
          all { ArtifactRepository repo ->
              if(repo instanceof MavenArtifactRepository){
                  def url = repo.url.toString()
                  if (url.startsWith('https://repo1.maven.org/maven2')) {
                      project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
                      remove repo
                  }
              }
          }
          maven { url ALIYUN_REPOSITORY_URL }
      }
    }
    
    2、IDEA 中指定 gradle 工作目录。
    image.png
    3、通过 Gradle 创建 SpringBoot 项目。
    image.png

这里我们看到:工程目录比刚刚多了个 setting.gradle 文件,现在来单独说明下这个文件具体有啥作用:

  • Gradle 支持多工程构建,使用 settings.gradle 来配置添加子工程(模块)
  • settings 文件在初始化阶段执行,创建 Settings 对象,在执行脚本时调用该对象的方法
  • Settings.include(String… projectPaths)

    • 将给定的目录添加到项目构建中,’:app’表示文件相对路径,相当于’./app’文件夹
    • 多项目架构进行分层,把同层次的子工程放在同一文件夹下便于管理,使用’:xxx:yyy’表示。

      2. 熟悉Gradle构建机制

      2.1 熟悉Gradle生命周期

      Gradle生命周期无非就是这三个:Initialization、Configuration、Execution。
  • Initialization

    • Gradle 支持单项目和多项目构建。在初始化阶段,Gradle 确定哪些项目将参与构建,并为每个项目创建 Project 实例,一般我们不会接触到它。(比如解析settings.gradle)
  • Configuration
    • 配置阶段,解析每个工程的 build.gradle 文件,创建要执行的任务子集和确定各种任务之间的关系,并对任务的做一些初始化配置。
  • Execution
    • 运行阶段,Gradle 根据配置阶段创建和配置的要执行的任务子集,执行任务。

      2.2 熟悉Gradle执行流程

      配置Gradle - 图6

      2.3 熟悉Gradle配置阶段

  1. 解析每个 Project 中的 build.gradle,解析过程中并不会执行各个 build.gradle 中的 task。
  2. 经过 Configration 阶段,Project 之间及内部 Task 之间的关系就确定了。一个 Project 包含很多 Task,每个 Task 之间有依赖关系。Configuration 会建立一个有向图来描述 Task 之间的依赖关系,所有 Project 配置完成后,会有一个回调 project.afterEvaluate(),表示所有的模块都已经配置完了。

因为这里配置阶段和 Gradle 对应的 Task(任务列表)相互绑定,所以这里不好拿代码单独解释配置相关的方法,需要结合 Gradle 任务一起讲,所以这里先忍耐一下,等讲完Task(任务列表)后,再一起解析。

2.4 熟悉Gradle任务

  • task 是 gardle 中最小的任务单元,任务之间可以进行复杂的操作(如动态创建任务,多任务间依赖调用等等)。gradle 的执行其实就是由各种任务组合执行,来对项目进行构建的
  • 使用 gradlew help 命令,任何 gradle 项目都有一个该 task,可以执行此命令观察 task 执行的流程是否如预期。
  • 可以使用工具查看,还可以通过 gradlew tasks 命令查看可运行任务。
    • 使用 gradlew tasks --all 命令查看所有任务。
    • 使用 gradlew A B 命令表示执行任务 A 和 B,支持驼峰简写。