DPE 大学已上线!了解更多关于 Gradle 构建工具、Gradle 构建扫描、Develocity 和生态系统的信息 关闭

Gradle 构建工具功能

此分类的 Gradle 构建工具功能列表将帮助您了解 Gradle 构建工具在您的用例中的一些功能。查看 用户指南 以供参考,并查看 Gradle 构建工具教程 以开始使用。

目录

运行 Gradle 构建

这些功能会影响运行 Gradle 构建的开发人员,并且任何运行 Gradle 的人都可以利用这些功能。

性能

增量构建

Gradle 会在构建之间检查任务的输入、输出或实现自上次构建调用以来是否发生了变化。如果没有,则该任务被认为是最新的,不需要执行。Gradle 还将任务的配置视为其输入的一部分。

构建缓存

如果任务已在另一台计算机上执行,Gradle 可以跳过本地执行,而是从构建缓存中加载任务的输出。典型的用例是让 CI 构建推送到共享构建缓存,并允许开发人员从中拉取。本地构建缓存也可用于重用在同一台机器上先前生成的的任务输出。

增量任务

当 Gradle 发现任务的输入或输出在构建运行之间发生了变化时,该任务将再次执行。该任务可以使用增量 API 来了解哪些文件发生了确切的变化。有了这些信息,该任务可能不需要重建所有内容。

增量注解处理

当存在支持的注解处理器时,增量注解处理会显著提高 增量编译 的效率。

编译器守护进程

当您需要分叉编译过程时,Gradle 会创建一个守护进程,该守护进程将在多项目构建中重复使用。这为编译过程提供了显著的速度提升。

并行执行

Gradle 允许通过 Worker API 并行执行任务和任务内工作。并行性非常细粒度,从而提高了性能。

并行下载依赖项

Gradle 将并行下载依赖项元数据(通常为 `pom.xml`)和工件。这仅在需要工件时按需完成。

任务超时

每个任务都有一个超时属性,可用于限制其执行时间。当任务达到其超时时间时,其任务执行线程将被中断,从而允许构建完成。

构建扫描

基于 Web 的构建可视化

通过丰富的 Web 界面而不是文本控制台和文本文件来了解构建中发生了什么。构建扫描提供更多信息,并且更有效。

协作调试

与同事共享构建扫描,以有效地解决问题并共同改进。共享整个扫描或链接,重点关注特定构建方面,例如日志输出行。

扩展和定制

将您自己的数据作为标签、值和链接添加到构建扫描中。将构建扫描集成到您的工具链中。

细粒度构建比较 [Develocity]

构建扫描比较可以快速突出显示构建之间的差异,例如依赖项及其版本,从而使根本原因分析更快。

跟踪和导出所有构建的历史记录 [Develocity]

跟踪所有构建的关键构建指标,包括本地开发构建,而不仅仅是 CI 构建。了解趋势并将构建扫描数据导出到您选择的存储位置。

执行选项

持续构建

当 Gradle 任务在连续模式下运行时,Gradle 会自动监视此任务输入的变化。每当输入发生变化时,任务就会自动执行。您可以在多项目构建中连续运行多个任务。

组合构建

组合构建允许您包含其他独立项目,以便您可以例如同时开发一个应用程序及其依赖的库。它们默认情况下并行构建,并且可以嵌套。

任务排除

您可以排除任何任务的运行。当您排除一个任务时,所有此任务依赖的任务也会自动排除,前提是它们没有其他依赖项。

干运行

运行构建以查看哪些任务实际上被执行,而无需执行任务操作。

在失败后继续执行

构建不会在遇到第一个失败时停止。这使得能够在单个构建执行中发现尽可能多的失败,并在最后提供一个非常好的聚合错误报告。

快速失败测试执行

虽然在测试失败后继续执行是 Gradle 的默认行为,但您可以设置 `--fail-fast` 标志或为 Gradle 构建配置 `failFast=true`,以便在您的一个测试失败后立即失败并完成。

同步依赖项缓存与存储库

Gradle 有一个 `--refresh-dependencies` 选项,用于忽略所有已解析模块和工件的缓存条目。将针对所有配置的存储库执行新的解析,并重新计算动态版本,刷新模块并下载工件。但是,Gradle 会在再次下载之前检查先前下载的工件是否有效。这是通过比较存储库中发布的 SHA1 值与现有下载工件的 SHA1 值来完成的。

↑ 目录

编写 Gradle 构建

这些功能会影响构建作者和负责开发人员生产力的人员。

构建逻辑是可测试代码

Groovy DSL

理想情况下,Groovy 构建脚本看起来主要像配置,包括设置一些项目属性,配置依赖项,声明任务等。该配置基于 Groovy 语言结构。

Kotlin DSL

Gradle 的 Kotlin DSL 提供了传统 Groovy DSL 的替代语法,在支持的 IDE 中提供增强的编辑体验,以及更强大的内容辅助、重构、文档等功能。

Gradle 初始化插件

Gradle 构建初始化插件可以创建各种类型的 Gradle 构建(Java 应用程序、Java 库、Groovy 库、Kotlin 应用程序等),或者将现有构建(例如 Apache Maven 构建)转换为 Gradle 构建。

依赖管理

传递依赖

使用依赖管理系统的主要优势之一是管理传递依赖。Gradle 负责下载和管理传递依赖。

自定义依赖范围

不要受限于预定义的依赖范围集(编译、运行时等)。Gradle 允许您定义任意依赖范围。例如,您可以为构建中可能建模的集成测试、构建中需要的工具链等定义依赖范围。

基于文件的依赖

并非所有依赖都可以在外部仓库中获得。当管理依赖不切实际或迁移遗留构建时,声明对文件系统资源的依赖可能很有用。

自定义仓库布局

声明具有自定义布局的仓库。使用自定义布局,您可以有效地将几乎任何文件系统目录结构视为工件仓库。

第三方依赖缓存

来自远程仓库的依赖将被下载并缓存在本地。后续构建将使用缓存的工件,以避免不必要的网络流量。

兼容 Maven 和 Ivy 仓库

Gradle 兼容 POM 和 IVY 元数据格式,可以从任何 Maven 或 IVY 兼容的仓库中检索依赖。Ivy 元数据暴露给自定义解析规则,允许您根据工件分支、状态或其他自定义元数据信息进行过滤。

原生 BOM 支持

平台定义(也称为 Maven BOM 依赖)在原生环境中得到支持。这使得您可以导入像 Spring Boot 平台这样的定义,而无需外部插件。

动态依赖

解析的依赖版本可以是动态的。Gradle 支持 Maven 快照机制,但功能更强大。您可以声明对最新版本的依赖、最新的开发版本,甚至最新的 8.X 版本的依赖。

动态依赖锁定

允许构建在使用动态依赖版本时保持确定性和可重复性。

动态依赖选择规则

定义自定义规则,以便在声明动态依赖项时选择特定版本。这些规则可以基于名称和版本,以及分支或状态等扩展元数据。规则还可以根据构建发生的環境而有所不同,例如本地或 CI。

依赖版本对齐

依赖对齐允许逻辑组中的不同模块(例如 Jackson 模块)对齐到同一个版本。

版本冲突解决

默认情况下,Gradle 将冲突解析为最新请求的版本。您可以自定义此行为。

兼容库的替换

使用依赖项替换规则来指定要使用的依赖项。例如,您可以指示 Gradle 通过选择 log4j 或 log4j-over-slf4j 的最新版本来解决冲突。这在依赖关系图中存在 spring-all 和 spring-core 等库的情况下特别有用。如果没有适当的管理,应用程序的行为可能会依赖于脆弱的类路径顺序。

增强的元数据解析支持

您可以在 Gradle 下载存储库元数据后但选择已解析版本之前调整依赖项元数据。这种灵活性使您可以创建自定义规则,用于将模块声明为更改(快照)版本或使用自定义状态方案。

外部和项目依赖项的替换

动态地将外部依赖项替换为项目依赖项,反之亦然。当只有部分模块在本地检出时,这尤其有用。

跨团队标准化 Gradle

自供应构建环境

使用 Gradle 包装器,Gradle 构建环境会自动供应。此外,您可以确定应使用哪个版本来构建您的项目。

版本控制的构建环境配置

用于配置构建环境的重要参数可以作为项目的一部分存储在版本中。开发人员无需手动设置它们。这包括要使用的 Gradle 版本、运行构建的 JVM 的配置以及运行构建的 JDK。

自定义分发

每个 Gradle 分发版都有一个 init.d 目录,您可以在其中放置自定义脚本,这些脚本可以预先配置您的构建环境。您可以使用它来应用强制的自定义规则,为开发人员提供内置的设置任务等等。结合 Gradle 包装器,您可以轻松地分发这些自定义分发版。

软件领域建模

域对象容器

每个描述构建的域对象,无论是仓库、源目录、插件还是依赖项,都存储在一个响应式容器中,您可以向其注册监听器。您可以完全控制特定构建脚本添加到构建中的内容。增强或修改已添加的内容,让构建失败,或发出警告。例如,您可以定义仅在构建添加特定插件时才添加的依赖项。

发布多个工件

Gradle 可以在每个项目中发布多个具有不同元数据的工件。无论是 API 和实现 jar、库和测试夹具,还是针对不同 Java 平台的变体。

高级任务排序

除了完全控制任务之间创建的依赖关系之外,Gradle 还具有强大的语言结构来描述任务之间的执行顺序,即使这些任务彼此之间没有依赖关系。这可以通过 shouldRunAfter 和 mustRunAfter 关系来建模。

任务依赖关系推断

Gradle 对象知道哪些任务会生成特定内容。例如,表示 Java 二进制目录的对象知道 compile 任务会生成二进制文件。任何将 Java 二进制目录作为输入的任务将自动依赖于 compile 任务。它不需要手动声明。这使得构建更容易维护,也更健壮。

任务终结器

可以将任务分配给其他任务,类似于 Java 中的 finalizer 子句。这些特殊任务始终在另一个任务执行后运行,无论该任务是否失败。这在对容器或数据库进行生命周期管理时非常有用。

动态任务创建

有时您需要一个行为取决于大量或无限数量参数范围的任务。创建任务规则是一种非常不错且表达能力强的提供此类任务的方法。

细粒度构建事件监听器

Gradle 允许您挂钩到构建配置和执行生命周期的每个部分,以注入自定义行为、提取信息、添加额外的日志记录以及其他许多用例。

基于用户的行为注入

您可以将自定义监听器放入 Gradle 用户主目录中,这些监听器会挂钩到您机器上执行的每个 Gradle 构建。使用上面描述的生命周期监听器,您可以添加自定义行为来个性化您的构建体验。例如,添加和配置 Gradle 公告插件,该插件在构建完成后弹出一个窗口,或者添加您个人使用的仓库。

每次构建行为注入

类似于基于用户的行为注入,您可以在命令行中指定额外的监听器,这些监听器会挂钩到构建。例如,如果您希望 CI 构建具有特定行为(例如,如果使用非标准仓库则失败),这将非常有用。

Gradle 插件编写

用于功能测试的 TestKit

通过 API 以编程方式执行构建,与测试框架无关。检查构建结果和输出。跨版本兼容性测试。从 IDE 调试正在测试的构建。

自定义命令行选项

任务 API 支持一种机制,用于标记属性以在运行时自动生成具有特定名称的相应命令行参数。

↑ 目录

特定于生态系统的功能

特定于 JVM、Android、C++、Swift、Objective C 和其他生态系统的功能。

JVM 应用程序

Java 的增量编译

无论源代码还是类路径发生变化,Gradle 都会检测受更改影响的所有类,并且只会重新编译这些类。

Java 的编译避免

如果依赖项目以 ABI 兼容的方式更改(仅其私有 API 发生更改),则 Java 编译任务将是最新的。

内置 Groovy 支持

Groovy 插件扩展了 Java 插件以添加对 Groovy 项目的支持。它可以处理 Groovy 代码、混合的 Groovy 和 Java 代码,甚至纯 Java 代码。

内置 Scala 支持

Scala 插件扩展了 Java 插件以添加对 Scala 项目的支持。它可以处理 Scala 代码、混合的 Scala 和 Java 代码,甚至纯 Java 代码。

内置支持 JVM 代码质量工具

Gradle 发行版包含 CheckstyleCodeNarcPMDJaCoCo 和其他工具的插件。

JAR、WAR 和 EAR 的打包和分发

Gradle 附带开箱即用的工具,用于将基于 JVM 的代码打包到常见的存档文件中。

发布到 Maven 存储库

将工件发布到 Maven 存储库,例如 Bintray 或 Maven Central。

发布到 Ivy 存储库

将工件发布到 Ivy 存储库,具有可自定义的目录布局。

Ant 集成

您可以深度集成任何默认、可选或自定义 Ant 任务。您还可以导入运行时的 Ant 构建,甚至部分替换依赖于 Gradle 任务的 Ant 目标。

Android 应用程序

官方 Android 构建工具

Gradle Android 插件和 Android Studio 是 Android SDK 工具团队提供的官方工具,并由其维护。要了解有关将 Gradle 与 Android 一起使用的更多信息,请参考 Android 开发者文档中的 Gradle

原生应用程序

构建 C/C++/Obj-C/Obj-C++/汇编程序

Gradle 内置支持使用汇编程序、C/C++ 和 Obj-C/C++ 编译和链接程序。Gradle 可以构建共享库、静态库和可执行文件。

原生组件模型变体

轻松地为原生组件建模变体,例如支持不同的 ABI、操作系统、构建类型等。

GCC 支持

Gradle 支持在 Linux、Windows(使用 Cygwin 和 MingW)和 Mac OS X 上使用 GCC4 构建。

Clang 支持

Gradle 支持在 Linux 和 Mac OS X 上使用 Clang 构建。

MS Visual C++ 支持

Gradle 支持在 Windows 上使用 Microsoft 的 Visual C++ 编译器构建。(支持 VS 2010、VS 2013 和 VS 2015)

生成 Windows 资源

Gradle 使用 Microsoft 的资源编译器将 Windows 资源脚本文件构建到您的应用程序中。

并行编译

在构建原生代码时,Gradle 将编译步骤划分为可并行化的任务,并在共享资源池中执行它们。这加快了单个项目的情况,并确保 Gradle 在并行多项目构建中不会消耗太多资源。

预编译头文件

Gradle 使您在构建软件时轻松使用预编译头文件。如果您的项目在大多数源代码中包含许多头文件,则预编译头文件可以加快编译时间。预编译头文件是编译器特有的优化,用于缓存已解析的头文件版本。

构建混合语言二进制文件

Gradle 可以构建不同的语言(例如,汇编程序和 C),并将它们链接到单个可执行文件或库中。

CUnit 测试支持

Gradle 支持使用 CUnit 测试 C 应用程序。

GoogleTest 支持

Gradle 支持使用 GoogleTest 测试 C++ 应用程序。

缓存编译

在构建原生代码时,Gradle 使用构建缓存来避免重新编译未更改的代码。编译器参数、宏定义和头文件在重用缓存编译时都会被考虑。

↑ 目录

开发者工具提供商的功能

这些功能对于那些从事 IDE 和持续集成系统的人来说最有趣,但还有许多其他创造性的用途。

将 Gradle 与工具 API 嵌入

嵌入式使用的 SDK

由 Gradle 工具 API 提供

版本无关

Gradle 工具 API 向后和向前兼容。使用特定版本的工具 API,您可以驱动自 1.0 版本以来的所有 Gradle 版本的构建。

查询项目模型

您可以查询 Gradle 以获取构建的详细信息,包括项目层次结构、项目依赖项、外部依赖项(包括源代码和 Javadoc jar)、源代码目录以及每个项目中的任务。

查询构建环境信息

Gradle 提供对构建环境信息的编程访问。这包括有关 Gradle 版本、Gradle 用户主目录和 Java 主目录的信息。

执行构建

您可以执行构建并监听标准输出和标准错误日志以及进度(例如,在命令行上运行时显示在“状态栏”中的内容)。

构建操作取消

通过 Gradle 工具 API 启动的所有操作都可以在构建过程中的任何时间优雅地取消。

支持自定义 JVM 设置

通过 Gradle 工具 API 提供的 JVM 参数优先于 gradle.properties。

提供 Eclipse 项目模型

Gradle 工具 API 提供了一个模型,描述了您的项目如何映射到 Eclipse 项目。

提供 IDEA 项目模型

Gradle 工具 API 提供了一个模型,描述了您的项目如何映射到 IDEA 模型。

提供对自定义项目模型的支持

您可以编写一个 Gradle 插件来为 Gradle 工具 API 添加自定义元数据。例如,当您将自己的产品/自定义集成到 Gradle 时,可以使用它。

运行特定测试

TestLauncher API 允许在多个测试任务中运行特定的 JUnit 或 TestNG 测试。

注册进度事件

注册任务或测试进度的事件,以获取有关构建过程的丰富信息,包括已处理的任务和测试。

运行持续构建

Gradle 工具 API 提供了以“持续构建”模式以编程方式运行构建的功能。构建输入(文件更改)的变化会持续触发指定的任务运行。

可定制的日志记录

自定义日志记录模式

您可以用自己的日志记录 UI 替换大部分 Gradle 日志记录 UI。例如,如果您想以某种方式自定义 UI,例如记录更多或更少的信息或更改格式,您可能会这样做。

重定向来自其他工具的输出

构建输出对于构建用户体验非常重要。与外部工具和库集成可能会使控制台输出非常冗长。在 Gradle System.out 中,Java Util Logging、Jakarta Commons Logging 和 Log4j 的日志输出被重新路由到 Gradle 日志记录系统。您可以根据每个工具的基础路由和定义日志级别。

↑ 目录