Gradle【从无到有从有到无】【用户手册】【G1】什么是Gradle?
目录
总览
Gradle是一个开放源代码的构建自动化工具,旨在灵活地构建几乎任何类型的软件。以下是其一些最重要功能的高级概述:
1.高性能
Gradle通过仅运行需要运行的任务来避免不必要的工作,因为它们的输入或输出已更改。您还可以使用构建缓存来重用以前运行的任务输出,甚至可以重用其他机器(带有共享构建缓存)的任务输出。
Gradle实施了许多其他优化,并且开发团队不断努力提高Gradle的性能。
2.JVM基础
Gradle在JVM上运行,并且必须安装Java开发工具包(JDK)才能使用它。对于熟悉Java平台的用户来说,这是一个好处,因为您可以在构建逻辑中使用标准Java API,例如自定义任务类型和插件。它还使在不同平台上运行Gradle变得容易。
请注意,Gradle不仅限于构建JVM项目,它甚至附带对构建本机项目的支持。
3.约定
Gradle从Maven的书中摘取了叶子,并通过实现约定使常见类型的项目(例如Java项目)易于构建。应用适当的插件,您可以轻松地为许多项目使用苗条的构建脚本。但是这些约定并不限制您:Gradle允许您覆盖它们,添加自己的任务以及对基于约定的构建进行许多其他自定义。
4.可扩展性
您可以轻松扩展Gradle以提供您自己的任务类型甚至构建模型。有关此示例,请参见Android构建支持:它添加了许多新的构建概念,例如口味和构建类型。
5.IDE支持
几个主要的IDE允许您导入Gradle构建并与其进行交互:Android Studio,IntelliJ IDEA,Eclipse和NetBeans。Gradle还支持生成将项目加载到Visual Studio所需的解决方案文件。
6.洞察力
构建扫描提供了有关构建运行的广泛信息,可用于识别构建问题。他们特别擅长帮助您确定构建性能的问题。您还可以与其他人共享构建扫描,如果您在解决构建问题时需要征求意见,这将特别有用。
您需要了解有关Gradle的五件事
Gradle是一种灵活而强大的构建工具,当您初次启动时,很容易感到恐惧。但是,了解以下核心原则将使Gradle更加容易上手,并且您将在不知道该工具的情况下熟练掌握该工具。
1.Gradle是通用的构建工具
Gradle允许您构建任何软件,因为它对正在尝试构建的内容或应如何完成的工作做出很少的假设。最明显的限制是,依赖项管理当前仅支持与Maven和Ivy兼容的存储库以及文件系统。
这并不意味着您需要做很多工作来创建构建。Gradle通过添加一层约定和通过插件预先构建的功能,可以轻松构建常见类型的项目(例如Java库)。您甚至可以创建和发布自定义插件来封装自己的约定并构建功能。
2.核心模型基于任务
Gradle将其构建模型建模为任务(工作单元)的有向无环图(DAG)。这意味着构建实质上配置了一组任务,并根据它们的依赖关系将它们连接在一起以创建该DAG。创建任务图后,Gradle将确定需要按顺序运行的任务,然后继续执行它们。
此图显示了两个示例任务图,一个是抽象图,另一个是具体图,其中任务之间的依赖性表示为箭头:
图1. Gradle任务图的两个示例
这样,几乎所有构建过程都可以建模为任务图,这就是Gradle如此灵活的原因之一。任务图既可以由插件定义,也可以由您自己的构建脚本定义,任务通过任务依赖机制链接在一起。
任务本身包括:
-
动作(Actions)-做某事的工作,例如复制文件或编译源代码
-
输入(Inputs)-操作使用或对其进行操作的值,文件和目录
-
输出(Outputs)-操作修改或生成的文件和目录
实际上,以上所有内容都是可选的,具体取决于任务需要执行的操作。有些任务(例如标准生命周期任务)甚至没有任何动作。他们只是为了方便而将多个任务聚合在一起。
✨您选择要运行的任务。通过指定执行所需任务的任务来节省时间,但仅此而已。如果您只想运行单元测试,请选择执行该任务的任务-通常为
test
。如果要打包应用程序,则大多数构建都有一个assemble
任务。
最后一件事:Gradle的增量构建支持是可靠且可靠的,因此,clean
除非您确实想执行清理工作,否则避免执行该任务以保持构建快速运行。
3.Gradle有几个固定的构建阶段
重要的是要了解Gradle分三个阶段评估和执行构建脚本:
-
初始化
设置构建环境,并确定哪些项目将参与其中。
-
组态
构造和配置用于构建的任务图,然后根据用户要运行的任务确定需要运行的任务和顺序。
-
执行
运行在配置阶段结束时选择的任务。
这些阶段构成了Gradle的Build Lifecycle。
✨与Apache Maven术语的比较
Gradle的构建阶段与Maven的阶段不同。Maven使用其阶段将构建执行划分为多个阶段。它们的作用与Gradle的任务图相似,但灵活性较差。
Maven的构建生命周期概念与Gradle的生命周期任务大致相似。
设计良好的构建脚本主要由声明性配置而不是命令式逻辑组成。可以理解,在配置阶段评估该配置。即便如此,许多此类构建也具有任务操作(例如,通过doLast {}
和doFirst {}
块),这些任务在执行阶段进行评估。这很重要,因为在配置阶段评估的代码不会看到在执行阶段发生的更改。
配置阶段的另一个重要方面是,每次构建运行时都会评估其中涉及的所有内容。这就是为什么最佳做法是在配置阶段避免昂贵的工作。构建扫描可以帮助您识别此类热点。
4.Gradle的扩展方式不止一种
如果您可以仅使用Gradle捆绑的构建逻辑来构建项目,那将是很好的,但这几乎是不可能的。大多数构建都有一些特殊要求,这意味着您需要添加自定义构建逻辑。
Gradle提供了多种机制来扩展它,例如:
-
当您希望构建完成现有任务无法完成的工作时,只需编写自己的任务类型即可。通常最好将自定义任务类型的源文件放在buildSrc目录或打包的插件中。然后,您可以像Gradle提供的任何任务一样使用自定义任务类型。
-
自定义任务操作。
您可以通过Task.doFirst()和Task.doLast()方法附加在任务之前或之后执行的自定义构建逻辑。
-
项目和任务的额外属性。
这些允许您将自己的属性添加到项目或任务中,然后可以从您自己的自定义操作或任何其他构建逻辑中使用它们。额外的属性甚至可以应用于您未明确创建的任务,例如Gradle的核心插件创建的任务。
-
自定义约定。
约定是简化构建的强大方法,因此用户可以更轻松地理解和使用它们。使用标准项目结构和命名约定的构建(例如Java build)可以看出这一点。您可以编写自己的提供约定的插件-它们只需要为构建的相关方面配置默认值。
-
Gradle允许您将新概念引入除任务,文件和依赖项配置之外的内部版本。您可以在大多数语言插件中看到这一点,这些插件将源集的概念添加到了构建中。构建过程的适当建模可以大大提高构建的易用性及其效率。
5.构建脚本针对API运行
将Gradle的构建脚本视为可执行代码很容易,因为这就是它们。但这只是一个实现细节:精心设计的构建脚本描述了构建软件所需的步骤,而不是这些步骤应如何工作。 这是定制任务类型和插件的工作。
✨人们普遍误认为Gradle的功能和灵活性来自其构建脚本是代码这一事实。这离事实还远。提供功能的是底层模型和API。正如我们在最佳实践中建议的那样,您应该避免在构建脚本中放置太多(如果有)命令式逻辑。
然而,在一个区域中,将构建脚本视为可执行代码很有用:了解构建脚本的语法如何映射到Gradle的API。由Groovy DSL参考和Javadocs组成的API文档列出了方法和属性,并引用了闭包和操作。这些在构建脚本的上下文中是什么意思?查看Groovy Build Script Primer,以了解该问题的答案,以便您可以有效地使用API文档。
✨由于Gradle在JVM上运行,因此构建脚本也可以使用标准Java API。Groovy构建脚本可以另外使用Groovy API,而Kotlin构建脚本可以使用Kotlin。