[Gradle翻译]了解Gradle:构建生命周期

96 阅读4分钟

本文由 简悦SimpRead 转码,原文地址 proandroiddev.com

很容易找到关于 "如何创建gradle自定义任务"、"如何减少构建t...... "的文章。

image.png

很容易找到关于 "如何创建gradle自定义任务"、"如何减少构建时间"、"如何构建gradle构建文件 "等文章。但关于Gradle在引擎盖下如何真正工作的文章却不常见。今天,让我们集中讨论Gradle "黑暗面 "的一小部分:构建生命周期。

在我们解释Gradle的构建周期之前,让我们先就Gradle领域中的一些基本定义达成共识。

项目

这是对Gradle来说最重要的概念之一。事实上,一个项目是对需要构建的东西的表示,并在构建结束后导致一个工件。例如,在Android上,:app模块是一个Gradle项目。如果你在你的Android项目中还有另一个模块(不要在这里混淆),该模块也是Gradle的一个项目。

  • 项目是在settings.gradle文件中注册的。
  • 大多数情况下,一个项目有一个build.gradle文件

任务

任务,顾名思义,是在构建过程中需要执行的动作(默认或自定义)的表示。例如,Java代码的编译是由一个任务开始的。任务是在项目构建脚本中定义的,并且可以相互之间有依赖关系。

现在我们知道了这些大写的术语,让我们来深入了解一下主要的内容

构建阶段

每次Gradle构建都会按照相同的顺序经历3个不同的生命周期阶段。

初始化阶段

在这个阶段,Gradle试图识别所有参与构建过程的项目。对于Gradle来说,知道它是单项目构建还是多项目构建是非常重要的。在一个多项目构建中,有几个项目需要评估。因此,有几个构建脚本。Gradle会查看settings.gradle文件,以便识别不同的项目。在初始化阶段结束时,Gradle创建了一个org.gradle.api.Project的实例,对应于这些项目中的每一个。

配置阶段

在这个阶段,Gradle执行上一阶段确定的每个项目的构建脚本。实际上,非常重要的一点是,我们说 "Gradle执行构建脚本 "并不意味着这些构建脚本中的Tasks也被执行了。相反,在将这些脚本作为简单的Groovy脚本进行评估并确定其中的任务后,Gradle会建立一个直接无环图 (DAG) 的任务对象。DAG是一种数学算法,用于表示不包含循环的图。有向 "一词意味着每个依赖箭头都朝一个方向走。"无周期 "意味着图中没有循环。

image.png

来自《Gradle Recipes for Android》一书的Java插件任务的直接无环图

在配置阶段还需要提到的一点是,Gradle引入了一个叫做configuration on demand的功能,使其能够在构建过程中只配置相关和必要的项目。这在大型多项目构建中非常有用,因为它可以大大减少构建时间。

执行阶段

这是最后一个阶段。在这个阶段,Gradle根据上一阶段创建的任务对象的DAG来识别需要执行的任务,并根据它们的依赖顺序来执行它们。所有的构建工作和活动实际上都在这个阶段完成。例如:编译源代码和生成.class文件,复制文件,清理构建目录,上传档案,归档文件等。


这很酷,但它在现实生活中是什么样子的?

那么,在 "现实生活 "中,这些阶段很容易在你的gradle文件中被识别。例如,如果你在settings.gradle文件中放了一段代码,它将在初始化阶段被评估。你的构建脚本文件中的代码,如果与你的任务的动作无关,则在配置阶段评估。最后,任务的实际操作中的代码,如任务的doLast闭包,在执行阶段被评估。

让我们看一下。

image.png

settings.gradle

image.png

build.gradle

以及输入 gradle test testBoth 命令后的构建结果

image.png

gradle test testBoth 的输出结果


让我们把它总结一下

这张图片可以让你了解我们在这篇文章中一直在谈论的内容。我们在这里以一种非常简单和愚蠢的方式表示了生成jar的构建过程,但它可以是其他任何东西,如ar、apk、war等等。

image.png

3个构建生命周期阶段及其产出

谢谢你的阅读,我希望我帮助你以某种方式学到了一些新东西。也许我忘了什么,也许我错了什么,如果是这样的话,请留下评论,我们可以讨论这个问题。

参考资料

请注意,在这里我们试图对所有这些东西给出一个简单和高层次的解释,但你可以通过下面的参考资料来帮助自己深入了解它。