文章摘要(AI生成)
概述Gradle 是一个开源构建自动化工具,其设计足够灵活,可以构建几乎任何类型的软件。以下是其一些最重要功能的高级概述:高性能Gradle 通过只运行那些因为输入或输出发生变化而需要运行的任务来避免不必要的工作。您还可以使用构建缓存来重用以前运行的任务输出,甚至可以重用来自不同机器(使用共享构建缓
概述
Gradle 是一个开源构建自动化工具,其设计足够灵活,可以构建几乎任何类型的软件。以下是其一些最重要功能的高级概述:
-
高性能
Gradle 通过只运行那些因为输入或输出发生变化而需要运行的任务来避免不必要的工作。您还可以使用构建缓存来重用以前运行的任务输出,甚至可以重用来自不同机器(使用共享构建缓存)的任务输出。Gradle 实现了许多其他优化,开发团队不断努力提高 Gradle 的性能。
-
JVM基础
Gradle 在 JVM 上运行,您必须安装 Java 开发工具包 (JDK) 才能使用它。这对于熟悉 Java 平台的用户来说是一个奖励,因为您可以在构建逻辑中使用标准 Java API,例如自定义任务类型和插件。它还使得在不同平台上运行 Gradle 变得容易。请注意,Gradle 不仅限于构建 JVM 项目,它甚至还包含对构建本机项目的支持。
-
约定
Gradle 借鉴了 Maven 的书,通过实现约定使常见类型的项目(例如 Java 项目)易于构建。应用适当的插件,您就可以轻松地为许多项目提供精简的构建脚本。但这些约定不会限制您:Gradle 允许您覆盖它们、添加您自己的任务以及对基于约定的构建进行许多其他自定义。
-
可扩展性
您可以轻松扩展 Gradle 以提供您自己的任务类型,甚至构建模型。有关此示例,请参阅 Android 构建支持:它添加了许多新的构建概念,例如风味和构建类型。
-
IDE 支持
几个主要的 IDE 允许您导入 Gradle 构建并与之交互:Android Studio、IntelliJ IDEA、Eclipse 和 NetBeans。Gradle 还支持生成将项目加载到 Visual Studio 所需的解决方案文件。
-
洞察力
构建扫描提供有关构建运行的大量信息,您可以使用这些信息来识别构建问题。他们特别擅长帮助您识别构建性能的问题。您还可以与其他人共享构建扫描,如果您需要寻求建议以解决构建问题,这将特别有用。
关于 Gradle 你需要知道的五件事
Gradle 是一个灵活而强大的构建工具,当你第一次开始时很容易感到害怕。但是,了解以下核心原则将使 Gradle 更加平易近人,并且您将在不知不觉中熟练使用该工具。
1. Gradle是一个通用的构建工具
Gradle 允许您构建任何软件,因为它对您尝试构建的内容或应该如何完成几乎没有假设。最显着的限制是依赖管理目前仅支持与 Maven 和 Ivy 兼容的存储库和文件系统。
这并不意味着您必须做很多工作来创建构建。Gradle 通过添加一层约定和通过插件预构建的功能,可以轻松构建常见类型的项目(例如 Java 库) 。您甚至可以创建和发布自定义插件来封装您自己的约定和构建功能。
2.核心模型基于任务
Gradle 将其构建建模为任务(工作单元)的有向无环图 (DAG)。这意味着构建本质上是配置一组任务并将它们连接在一起——基于它们的依赖关系——以创建 DAG。创建任务图后,Gradle 会确定哪些任务需要以何种顺序运行,然后继续执行它们。
该图显示了两个示例任务图,一个是抽象的,另一个是具体的,任务之间的依赖关系用箭头表示:
图 1. Gradle 任务图的两个示例
几乎任何构建过程都可以通过这种方式建模为任务图,这也是 Gradle 如此灵活的原因之一。并且该任务图可以由插件和您自己的构建脚本定义,任务通过任务依赖机制链接在一起。
任务本身包括:
- 动作——做某事的工作,比如复制文件或编译源代码
- 输入——动作使用或操作的值、文件和目录
- 输出——操作修改或生成的文件和目录
事实上,以上所有都是可选的,具体取决于任务需要做什么。某些任务(例如标准生命周期任务)甚至没有任何操作。他们只是为了方便而将多个任务聚合在一起。
您选择要运行的任务。通过指定执行您需要的任务来节省时间,但仅此而已。如果您只想运行单元测试,请选择执行该任务的任务——通常是
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 构建。您可以编写自己的插件来提供约定——它们只需要为构建的相关方面配置默认值。
-
定制模型。
Gradle 允许您将新概念引入构建中,而不仅仅是任务、文件和依赖项配置。您可以在大多数语言插件中看到这一点,它们将源集的概念添加到构建中。构建过程的适当建模可以极大地提高构建的易用性和效率。
5. 构建脚本对 API 进行操作
将 Gradle 的构建脚本视为可执行代码很容易,因为它们就是这样。但这是一个实现细节:精心设计的构建脚本描述了构建软件所需的步骤,而不是这些步骤应该如何完成工作*。*这是自定义任务类型和插件的工作。
有一个普遍的误解认为 Gradle 的强大和灵活性来自于它的构建脚本是代码这一事实。这与事实相去甚远。提供功能的是底层模型和 API。正如我们在最佳实践中建议的那样,您应该避免在构建脚本中放置太多(如果有的话)命令式逻辑。
然而,在一个领域将构建脚本视为可执行代码很有用:了解构建脚本的语法如何映射到 Gradle 的 API。API 文档——由Groovy DSL Reference和Javadocs组成——列出了方法和属性,并提到了闭包和操作。这些在构建脚本的上下文中意味着什么?查看Groovy Build Script Primer以了解该问题的答案,以便您可以有效地使用 API 文档。
由于 Gradle 在 JVM 上运行,构建脚本也可以使用标准Java API。Groovy 构建脚本可以额外使用 Groovy API,而 Kotlin 构建脚本可以使用 Kotlin 的。
评论区