Gradle 是什么
写在前面的话,最近在系统的学习Gradle,本来想写一篇关于 Gradle 的介绍。
但在官网发现了这篇关于 Gradle 的介绍,已经介绍的很好了,我就很直接翻译过来了。
原文地址 https://docs.gradle.org/current/userguide/what_is_gradle.html
Gradle 是什么?
Gradle 是开源的自动化构建工具,它的设计足够灵活,可以构建几乎任何软件。
它有以下几个显著的优点:
高性能
Gradle 只运行那些输入和输出有改变的任务,从而避免无效的工作。另外,还可以通过缓存开关重用之前的任务输出(其他的机器上的缓存也是可以的)。
Gradle还实现了许多其他优化,开发团队会持续不断地改进Gradle的性能。
基于 JVM
Gradle 是运行在 JDK上的,必须安装 JDK 才能运行。因为是运行在 JDK 上,这对于使用 Java 的用户是个额外的好处,可以在构建脚本中使用标准的 Java API,例如 自定义任务和插件,另外,因为是基于JDK的,它可以很好的跨平台运行。
Gradle 并不限于构建JVM项目,甚至还附带了对于构建本地项目的支持。
约定
Gradle 借鉴 Mavean 的做法,通过实现约定,使常见类型的项目(比如Java项目)易于构建。使用适当的插件可以很容易的为许多项目生成构建脚本。
约定并没有什么限制,可以覆盖原有的约定,添加自定义任务等来实现自己的构建模型。
扩展性
Gradle有很好的扩展性,可以添加定义自己的任务,覆盖已有的任务类型甚至定义自己的构建模型。Android 支持插件就是个很好的例子,在原有的基础上 增加了 flavor 和 buildType 约定。
IDE 支持
常见的几个主流 IDE 都支持导入 Gradle项目,并可以与之交互,例如 Android studio,Eclipse , IntelliJ IDEA,NetBeans等。Gradle 也有将项目文件加载进 Visual studio 的解决方案。
Insight
构建扫描 提供了构建运行的大量信息,可以使用它去定位构建问题。它可以帮你定位构建性能问题。也可以把它分享给其他人,这样在交流问题的时候就很有用了。
更详细的构建扫描可以查看这个文档 https://scans.gradle.com/?_ga=2.3508848.1142716506.1563790305-874993899.1553652374
Gradle 的五个重要概念
Gradle 是一个灵活而强大的工具,在刚使用的时候很容易望而生畏。理解下面几个核心原则后就会觉得Gradle还是很好理解的,这会帮助你更好的使用Gradle。
Gradle 是一个通用构建工具
因为Gradle 不对要做的构建或者如何构建做任何设想,所以Gradle几乎可以构建任务软件。
目前最大的限制就是依赖管理只支持 Maven 和 lvy 的编译库和文件。
虽然有这样的限制,但是在用的时候也不麻烦,对常见类型的项目都是很容易构建的-例如 Java编译库,通过添加一层约定和插件预构建功能,可以将自己的约定和功能封装成一个插件,当然也可以发布这个插件。
Gradle 的核心是基于任务
Gradle 将其构建建模为任务(工作单元)的有向无环图。意思是构建实际上是配置一组任务,并根据他们的依赖性创建一个有向无环图。一旦图创建完成,Gradle 将确定哪些任务以何种顺序运行,然后执行它们。
下面是两个任务图,一个是简单的,一个是很详细的,任务的依赖关系通过箭头表示。
几乎所有的构建过程都可以建模为任务图,这也是Gradle如此灵活的原因之一。任务图可以通过插件和你自己的脚本定义,关于任务依赖性 可以看 文档 https://docs.gradle.org/current/userguide/tutorial_using_tasks.html#sec:task_dependencies
任务由三部分构成
- 操作 ——做一些工作,例如复制文件或者编译源码
- 输入 ——值,行为能够操作的值,文件或者目录。
- 输出 ——行为修改或产生的值,文件或目录
实际上根据现实情况以上都是可选的,例如在Gradle 的生命周期里任务就有的什么也没做,只是将多个任务组合起来。
另外 Gradle 的增量编译是很强大可靠的,为了快速编译除非真的需要执行 clean 任务之外没必要执行clean操作。
你可以选择运行哪些任务。通过指定执行所需任务来节省时间,但也仅此而已。如果你想运行单元测试,就应该执行 test任务。如果您想打包应用程序,大多数构建都有相应的组装任务。
最后一件事:Gradle的增量构建支持是健壮和可靠的,所以除非您真的想执行一个clean任务,否则通过避免 clean 任务来保持构建的快速运行
Gradle有几个固定的构建阶段
理解Gradle在三个阶段评估和执行构建脚本是很重要的:
- 初始化
创建构建环境并确定哪些项目参与构建 - 配置
为构建构造和配置任务图,根据用户想要运行的任务确定以何种顺序执行哪些任务。 - 执行
运行配置阶段结束时选择的任务。
这些阶段就构成了 Gradle 的生命周期。
与Apache Maven术语的比较:
Gradle的构建阶段不像Maven的阶段。Maven的构建阶段将构建分为多个阶段。它们的作用类似于 Gradle 的任务图,尽管不那么灵活。
Maven的构建生命周期概念与Gradle的生命周期任务大致相似。
好的设计构建脚本主要由声明式配置而非命令逻辑组成。在配置阶段可以理解地评估该配置。即便如此,许多此类构建还具有任务操作 - 例如通过doLast {}和doFirst {}块 - 在执行阶段进行评估。这很重要,因为在配置阶段评估的代码不会看到在执行阶段发生的更改。
配置阶段另一个重要的方面是每次构建都会对其中涉及的所有内容做评估。这也是为什么应该在配置阶段避免多余的工作。构建扫描可以帮助你识别这样的事情。
Gradle 的扩展方式
如果Gradle 附带的构建逻辑无法满足我们的构建需求,而往往通常是这样。大部分的构建都有特定的需求,需要我们添加自己的构建逻辑。
Gradle 提供了以下几个主要方式去扩展它。
-
自定义任务类型
当 Gradle 本身的任务无法满足你的时候,你可以编写自己的任务类型。最好将编写的任务源文件放在 buildSrc 目录或者打包一个插件,然后你就可以像使用其他的Gradle 任务那样使用了。
参考 https://docs.gradle.org/current/userguide/custom_tasks.html -
自定义任务操作
你可以将自己的构建逻辑附加在任务的 开始之前 Task.doFirst() 和 结束之后 Task.doLast() 的方法里。
-
项目和任务的额外属性
Gradle 允许你为项目或者任务添加自己的属性,你可以在自定义行为或者其他构建逻辑中使用。额外的属性甚至可以应用于你没有显式创建的任务,比如由Gradle的核心插件创建的任务。
-
自定义约定
约定是一种简化构建的强大方法,这样用户就可以更容易地理解和使用它们。这可以在使用标准项目结构和命名约定(如Java构建)的构建中看到。
你可以编写自己的插件来提供约定——它们只需要为构建的相关方面配置默认值。 -
自定义模型
Gradle允许你引进除任务,文件和依赖配置之外的概念。可以在大多数语言插件中看到这一点,它们将源集的概念添加到构建中。对构建过程进行适当的建模可以极大地提高构建的易用性和效率。
脚本对API进行操作
构建脚本其实就是可执行代码。好的脚本描述了构建软件需要哪些步骤,而不是这些步骤应该怎么工作。那是定制任务和插件应该做的。
有一个常见的误解是Gradle的强大和灵活是因为它的脚本是代码,其实并不是。提供这种的能力的是底层模型和API。就像我们在实践中建议的那样,你不应该放太多命令式逻辑在脚本里。然而,将构建脚本视为可执行代码有一个方面是有用的:理解构建脚本的语法如何映射到Gradle的API。由Groovy DSL引用和 Javadocs组成的API文档列出了方法和属性,并引用了闭包和操作。这些在构建脚本上下文中意味着什么? 查看Groovy构建脚本入门,了解这个问题的答案,以便能够有效地使用API文档。 https://docs.gradle.org/current/userguide/groovy_build_script_primer.html#groovy_build_script_primer
因为Gradle运行在 JVM上,所以脚本中也可以使用标准的Java API,Groovy 脚本可以使用 Groovy API,Kotlin 脚本可以使用 Kotlin API。