Gradle是什么?

一个开源的项目自动化构建工具,建立在Apache Ant和Apache Maven概念的基础上,引入了基于Groovy的特定领域语言(DSL),而不再使用XML形式管理构建脚本。

项目自动化构建工具的作用

  • 进行依赖管理
  • 自动化测试、打包、发布的过程

Gradle的起源

Ant

Ant是Java的开源构建工具,使用XML编写文件。它的主要目的是为Java项目提供自动化配置的功能:例如将源文件编译为类,运行单元测试,打包JAR文件和创建Javadoc文档等。用户可以自定义目标并组织目标之间的依赖来实现目的。

Ant的组织结构如下:
image.png
Ant使用Target作为执行单元,每个Target是要执行一系列任务的组合。目标之间可以相互依赖。

下面是一个java项目构建的实例,这个实例包含四个步骤,分别为项目初始化,编译,打包成jar,删除中间产物。
image.png

通过自定义Target,用户可以自由配置构建过程,满足了构建的灵活性,不过Ant也有不少缺点,分别为:

  • 与使用更简洁的定义语言的构建工具相比,使用XML作为构建逻辑的定义语言会导致构建脚本过于冗长。冗长的代码增加了构建脚本的维护成本。
  • Ant并没有提供构建项目的指导标准,所以在企业级构建中,这会导致构建的混乱,项目中的每个新开发人员都需要了解每个构建文件的结构。
  • Ant没有在运行时查询内存模型的方法,所以无法知道在构建过程中到底执行了多少个任务。
  • 原生的Ant是没有依赖管理机制的,引用的jar文件通常需要人为管理。

Maven

针对Ant的问题,Maven在此基础上做了修改。Maven引入了标准化的项目布局和统一的构建生命周期。Maven采用约定优于配置的思想,即它为用户的项目配置提供了默认的执行流程以及设定了一些默认值。如果用户遵循默认流程,那么用户就不需要进行额外的构建配置。这个简化了用户编写配置文件的流程。同时,Maven也加入了依赖管理机制,如果用户需要引入额外的jar包,只需要在Maven的xml文件中进行配置即可,不用手动进行管理。

下面是一个配置实例,这个代码和之前Ant配置实现的功能一样,也是编译java项目并生成jar文件。但是由于默认配置的存在,代码简洁了不少。同时可以使用dependencies进行依赖管理。
image.png

但是,Maven构建项目也会有一些缺点:

  • Maven为项目提出了一个默认的结构和生命周期,这种结构和生命周期往往过于严格,有时候并不能满足自己项目的需求。
  • 为Maven编写自定义扩展非常麻烦。用户需要了解Mojos (Maven的内部扩展API),同时要使用xml来实现扩展功能。

Gradle的出现

针对以上两种构建工具的问题,开发者考虑能否实现一个介于两者之间的构建工具,即既可以满足构建的灵活性,同时也能遵循一些默认配置,又能减少代码的编写量。于是Gradle就应运而生了。
Gradle的优势在于:

  • 引入了基于Groovy的特定领域语言(DSL),不再使用XML形式管理构建脚本。这样做减少了构建脚本的代码长度。
  • 使用了基于任务(任务类似于Ant中的Target)的构建方式,满足了构建的灵活性。
  • 设置了生命周期,采用了约定优于配置的思想,对标Maven。
  • 有依赖管理的能力。

Gradle的组织形式

在Gradle构建中有两个基本的概念,分别为项目(project)任务(task),每个构建至少包含一个项目,项目中包含一个或者多个任务。

项目(project)

一个项目代表一个正在构建的组件(比如编译代码,将代码打包成一个jar文件),当构建启动后,Gradle会基于build.gradle实例化一个org.gradle.api.Project类,并且能够通过project变量使其隐式可用。

任务(task)

Gradle定义了任务(Task)来组织构建的过程。任务是指实现最小的工作单元,不同的任务通过构建一个有向无环图来表示任务之间的依赖,具体过程如下图:

项目实例

整体介绍

截屏2021-08-13 下午4.22.20.png

对于一个项目来说,主要进行项目依赖控制的文件是build.gradle。这个文件在根目录下必须存在,用于对整个项目进行配置。对于子模块,如果需要进行自动化构建的话,那么对应的文件夹下面也需要包含build.gradle的文件。
上图中的settings.gradle是用于进行多项目构建的设置文件。在该文件中,通过使用include方法来包含子项目。

创建任务

截屏2021-08-09 上午10.10.07.png
Gradle中所有的任务都是通过task定义的,每个任务实现了一种功能,我定义的这个任务实现了创建文件夹的功能。
同时,任务之间可以依赖,通过使用dependOn来依赖其他的任务。这个依赖表明需要在声明依赖的位置执行对应依赖的任务。

构建的生命周期

主要包含三个阶段,分别为初始化,配置,执行

初始化阶段

初始化阶段的任务是创建项目的层次结构,并且为每一个项目创建一个Project实例。 与初始化阶段相关的脚本文件是settings.gradle

配置阶段

配置阶段的任务是执行各项目下的build.gradle脚本,完成Project的配置,并且构造Task任务依赖关系图以便在执行阶段按照依赖关系执行Task。配置阶段执行的代码包括build.gralde中的各种语句、闭包以及Task中的配置段语句。

执行阶段

在配置阶段结束后,通过调用gradle <任务名>执行不同的任务。被执行的任务会根据配置阶段生成的任务依赖关系图依次执行依赖的任务。

钩子代码

在构建的过程中,Gradle还提供了钩子(Hook)代码,钩子代码是指在构建的生命周期中可以插入的代码的点。下图展示了Gradle生命周期中提供的Hook点,即形如”Gradle.settingsEvaluated()“的代码。如下图所示,如果我想在配置阶段所有项目的build.gradle执行完毕后执行一些指令,那么我可以在build.gradle文件中使用插入如下代码进行实现:

gradle.projectsEvaluated {
    // 自己的代码
}

image.png
图片链接:https://juejin.cn/post/684490...


hydra
1 声望0 粉丝

引用和评论

0 条评论