Gradle 基础介绍
以下内容为本人基于官方文档的翻译和理解,如果大家有条件可以直接查看 Gradle 官网:
Gradle 是一款专注于灵活性和性能的开源构建自动化工具。
Gradle 的build scripts 可以用Groovy or Kotlin DSL 来写。因为我是写 Android 的,平常开发的语言也是 Kotlin,所以我更倾向于用 Kotlin 来写 Gradle。
Gradle 主要有以下几个特点:
- 自定义能力强
- 构建速度快 (Gradle通过 重用先前执行的输出、仅处理已更改的输入、并行执行任务来快速完成任务)
- 强大: Android 官方推荐的构建工具,并支持多种语言
- 基于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。
下面有两个例子:
基本上所有的Gradle build 都能抽象成如上图所示的 TAG,这也就是为什么 Gradle 如此灵活的原因。
一个 Task 由这三点构成:
- Action
- Input
- Output
当然对于一个 task 上面的三个都是可选项,取决于 task 所需要做的事情。例如 standard lifecycle tasks 是没有 Action 的,他们的作用就是为了将多个 Task 聚合。
你可以指定具体执行哪一个任务,例如:
gradle test将执行 test 任务。
最后一点需要注意的事项是 Gradle 具有健壮的增量构建系统,来加快我们的 build 速度,所以尽量避免去执行 clean task 除非真的有必要去执行 clean 任务。
3. Gradle build 有三个固定的生命周期
- 初始化
设置 build 的执行环境并决定有些项目参与本次构建 - 配置阶段
根据 tasks 间的执行顺序和依赖关系来生成 TAG。 - 执行阶段
执行 TAG
4. Gradle 支持多种方式的拓展
理想情况下,如果我们仅仅可以使用 Gradle 捆绑的构建逻辑来构建项目。但这几乎是不可能的。大多数构建都有一些特殊要求,这意味着我们需要添加自定义构建逻辑。
- 自定义任务类型 当您希望构建完成现有任务无法完成的工作时,只需编写自己的任务类型即可。通常最好将自定义任务类型的源文件放在buildSrc目录或打包的插件中。然后,您可以像Gradle提供的任何任务一样使用自定义任务类型。
- 自定义任务动作。 您可以通过Task.doFirst()和Task.doLast()方法附加在任务之前或之后执行的自定义构建逻辑。
- 项目和任务的额外属性 这些允许您将自己的属性添加到项目或任务中,然后可以从您自己的自定义操作或任何其他构建逻辑中使用它们。额外的属性甚至可以应用于您未明确创建的任务,例如Gradle的核心插件创建的任务。
- 自定义约定 约定是简化构建的强大方法,因此用户可以更轻松地理解和使用它们。使用标准项目结构和命名约定的构建(例如Java build)可以看出这一点。您可以编写自己的提供约定的插件-它们只需要为构建的相关方面配置默认值。
- 自定义模型 Gradle允许您在任务,文件和依赖项配置之外将新概念引入构建。您可以在大多数语言插件中看到这一点,这些插件将源集的概念添加到了构建中。构建过程的适当建模可以大大提高构建的易用性及其效率。