Gradle (一)基础介绍

1,101 阅读4分钟

Gradle 基础介绍

以下内容为本人基于官方文档的翻译和理解,如果大家有条件可以直接查看 Gradle 官网:


Gradle 是一款专注于灵活性性能的开源构建自动化工具。

Gradle 的build scripts 可以用Groovy or Kotlin DSL 来写。因为我是写 Android 的,平常开发的语言也是 Kotlin,所以我更倾向于用 Kotlin 来写 Gradle。

Gradle 主要有以下几个特点:

  1. 自定义能力强
  2. 构建速度快 (Gradle通过 重用先前执行的输出仅处理已更改的输入并行执行任务来快速完成任务)
  3. 强大: Android 官方推荐的构建工具,并支持多种语言
  4. 基于JVM,所以在使用Gradle 之前必须先安装jdk

Gradle 的核心特性

1.Gradle是通用的构建工具

Gradle允许我们构建任何的项目,它对构建的内容和应如何完成的工作没有具体的限制,除此之外唯一的限制就是,添加依赖项管理目前只支持与Maven和Ivy兼容的存储库以及文件系统。

不过这并不意味着我们需要做很多工作来创建一个 Gradle。Gradle通过添加约定通用插件来添加预先构建的功能,使构建通用类型的项目(例如Java Library 和 Android lugin)变得容易。我们还可以创建和发布自定义插件来封装自己的约定并构建功能。 就比如一个 Android 项目,com.android.application 和 com.andorid.library 插件已经帮我们做了很多通用的事情,我们在 Android studio 里创建项目之后就可以跑。

2. Gradle 的核心构建模型

Gradle 的核心构建模型是基于TAG(有向无环图),也就是本质上来说 Gradle 的一次构建就是基于每个 Tasks 和他们相互之间的依赖关系来创建 TAG,并按序来执行这个 TAG。 下面有两个例子: TAG 基本上所有的Gradle build 都能抽象成如上图所示的 TAG,这也就是为什么 Gradle 如此灵活的原因。
一个 Task 由这三点构成:

  1. Action
  2. Input
  3. Output

当然对于一个 task 上面的三个都是可选项,取决于 task 所需要做的事情。例如 standard lifecycle tasks 是没有 Action 的,他们的作用就是为了将多个 Task 聚合。

你可以指定具体执行哪一个任务,例如:gradle test 将执行 test 任务。

最后一点需要注意的事项是 Gradle 具有健壮的增量构建系统,来加快我们的 build 速度,所以尽量避免去执行 clean task 除非真的有必要去执行 clean 任务。

3. Gradle build 有三个固定的生命周期
  1. 初始化
    设置 build 的执行环境并决定有些项目参与本次构建
  2. 配置阶段
    根据 tasks 间的执行顺序和依赖关系来生成 TAG。
  3. 执行阶段
    执行 TAG
4. Gradle 支持多种方式的拓展

理想情况下,如果我们仅仅可以使用 Gradle 捆绑的构建逻辑来构建项目。但这几乎是不可能的。大多数构建都有一些特殊要求,这意味着我们需要添加自定义构建逻辑。

  • 自定义任务类型 当您希望构建完成现有任务无法完成的工作时,只需编写自己的任务类型即可。通常最好将自定义任务类型的源文件放在buildSrc目录或打包的插件中。然后,您可以像Gradle提供的任何任务一样使用自定义任务类型。
  • 自定义任务动作。 您可以通过Task.doFirst()和Task.doLast()方法附加在任务之前或之后执行的自定义构建逻辑。
  • 项目和任务的额外属性 这些允许您将自己的属性添加到项目或任务中,然后可以从您自己的自定义操作或任何其他构建逻辑中使用它们。额外的属性甚至可以应用于您未明确创建的任务,例如Gradle的核心插件创建的任务。
  • 自定义约定 约定是简化构建的强大方法,因此用户可以更轻松地理解和使用它们。使用标准项目结构和命名约定的构建(例如Java build)可以看出这一点。您可以编写自己的提供约定的插件-它们只需要为构建的相关方面配置默认值。
  • 自定义模型 Gradle允许您在任务,文件和依赖项配置之外将新概念引入构建。您可以在大多数语言插件中看到这一点,这些插件将源集的概念添加到了构建中。构建过程的适当建模可以大大提高构建的易用性及其效率。