——《实战Gradle》中文版学习笔记

1、简述

Gradle是基于JVM构建工具的新一代版本。Gradle可以用一种声明式的方式为开发者的问题领域建模,它使用一种强大且具有表达性的基于Groovy的领域特定语言(DSL),而不是XML。因为Gradle是基于JVM的,它允许你使用自最喜欢的Java或者Groovy语言来编写定制逻辑。

Gradle提供了一套自己的依赖管理实现方式。不仅高度可配置,而且也尽可能地与现有额依赖管理设施(如Maven和Ivy)相兼容。Gradle对多项目构建的定义和组织提供了强有力的支持,以及对项目的依赖建模。

Ant可以在运行时装载,因此不需要任何额外的设置。

Maven遵循约定优于配置的规则,为Java项目引入了一个标准化的项目布局和构建生命周期。

2、Java构建工具的演变

Ant和Maven,经过这么多年,虽然都有大步提高和扩展的特性集,并且非常流行且变成行业标准,但它们都有一个缺点——构建逻辑必须用XML描述。XML是非常好的层级数据描述语言,但对于描述程序流程和构建逻辑却存在不足之处。

Gradle提供了具有表达性的DSL、约定优于配置的方法和强大的依赖管理。摒弃了XML,引入了动态语言Groovy来定义构建逻辑。

gradle构建java项目过程 gradle jvm_gradle构建java项目过程


Gradle构建脚本是声明式的、可读的,并且清晰地表达它们的意图。

gradle构建java项目过程 gradle jvm_Gradle_02


注:ThoughtWorks是一个声誉很好的软件开发咨询公司,会周期性地发布关于新技术、语言和工具的报告——它们称作技术雷达。(技术雷达的目的是帮助软件行业的决策者理解发展趋势和他们对市场的影响)

3、Gradle引人注目的特性集

Gradle是一个为企业准备的构建系统,由具有声明式和表达性的Groovy的DSL支持。它结合了灵活性和基于约定优于配置思想的扩展性,以及对传统依赖管理的支持。他背后有一个专业地服务公司(Gradleware)和强大的社区参与,Gradle成为了许多开源项目和企业构建方案的第一选择。

gradle构建java项目过程 gradle jvm_脚本语言_03

3.1 可表达性的构建语言和底层的API

gradle构建java项目过程 gradle jvm_Gradle_04


gradle构建java项目过程 gradle jvm_groovy_05


一个构建脚本直接映射到Gradle API中Project类型的一个实例。相应的,在构建脚本中dependencies配置块触发Project实例的dependencies()方法。

Gadle脚本中每一个元素都有一个与Java类一对一的映射。

Gradle最常用的构建就是执行一个工作单元,这个工作单元被描述成任务(task),Gradle的标准DSL部分就是能够确切地定义任务,从编译到打包Java源代码。

Gradle的开箱即用特性提供了两个配置块,允许你定义依赖以及远程仓库,如果标准的DSL元素不能满足你的需求,则可以通过Gradle的扩展机制引入你自己的词汇。

3.2 灵活的约定

Gradle最主要的思想之一就是针对你的项目给予引导和有意义的默认值。Gradle中的每个Java项目都确切地知道源代码和测试类文件的位置,知道如何编译代码,运行单元测试,生成Javadoc报告,以及发布代码。

gradle构建java项目过程 gradle jvm_groovy_06


约定构建,构建脚本开发人员并不需要知道它是怎么工作的。开发者可以完全集中精力到什么需要配置上,Gradle的约定和Maven提供的约定相似,但不会让你感觉到被限制。Gradle即提供约定,有给予你改变约定的能力。

3.3 鲁棒和强大的依赖管理

Gradle提供了一个基础设施区管理解析、获取和存储依赖的复杂性。一旦他们被下载并存储到本地缓存中,你的项目就可以使用了,企业构建的一个关键需求是可重现性。

在Gradle的世界里,每个子模块都被当作一个项目,里面会定义对外部库或者其他模块的依赖。此外,每个子模块都可以独立运行。Gradle帮你找到哪个子项目的依赖需要重新构建,而不需要将子项目的工件存储到本地缓存中。

3.4 可扩展的构建

Gradle支持通过指定任务的输入和输出进行增量性构建。他准确地找出哪些任务需要跳过,哪些需要构建或者部分构建。同样的思想也应用到多个模块项目中,叫作部分构建。因为你的构建清晰地定义了子模块之间的依赖关系,Gradle会负责重新构建需要的部分,不再是默认执行clean任务。

自动化单元测试、集成测试和功能测试是构建过程的一部分。将只需要短时间运行的测试和那些需要准备资源和外部依赖的测试分离是有道理的。

开发人员在开发过程中会多次运行构建。意味着每次都启动一个新的Gradle进程,载入所有的内部依赖和运行构建逻辑。要提高启动的效率,Gradle可以以守护进程模式运行。实际上,Gradel命令会fork出一个守护进程,它不仅会执行你的构建,而且会持续地在后台运行,后续的构建调用会交给这个守护进程以及避免启动时的消耗。这样,你就会看到一个更快速的初始化构建执行。

3.5 轻松的可扩展性

Gradle不会对于如何实现代码给出任何建议。相反,根据你的具体用例,它会提供给你不同的选择,最简单的实现定制逻辑的方式是实现一个任务。

3.6 和其他构建工具集成

gradle构建java项目过程 gradle jvm_groovy_07

4、从构建到部署自动化项目

持续交付引入了部署管道的概念,也叫作构建管道。部署管道是一种将软件从版本控制部署到产品环境过程的技术实现。这个过程由多个阶段组成。

gradle构建java项目过程 gradle jvm_groovy_08

  • 提交阶段:报告项目技术健康程度。这个阶段的主要利益相关者是开发团队,因为它提供了关于破坏原有功能代码的反馈和帮助找到“代码坏味道”。这个阶段的工作是编译源代码,运行测试,执行代码分析和准备发布。
  • 自动化验收测试阶段:通过运行自动化测试判断功能性和非功能性需求是否得到满足。
  • 手动测试阶段:验证系统在实际的测试环境中可用。这个阶段通常会包含QA人员在用户故事和用例级别验证需求。
  • 发布环境:要么以打包方式将软件交付给终端用户,要么将软件部署到产品环境。

5、总结

Gradle提供了基于约定的构建方法、可靠的依赖管理和多项目构建的支持。在本篇中,了解了在持续交付的构建管道中,Gradle是如何在每个阶段发挥作用。

参考书籍:《实战Gradle》中文版,李建等人译