声明式 Gradle EAP3 - 2025 年 4 月更新

引言

这是我们名为 Declarative Gradle 的实验项目更新。我们刚刚发布了一个新的抢先体验预览版 (EAP),它逐步改进了对声明性配置语言 (DCL) 中新数据类型的支持,并使得简单的真实项目能够尝试使用 Declarative Gradle。

Declarative Gradle 是我们 愿景 的一部分,旨在提供一种优雅且可扩展的声明性构建语言,让开发人员能够以清晰易懂的方式描述任何类型的软件。我们认为它将为软件开发人员的 Gradle 用户体验和工具功能带来根本性的进步。

我们于 2024 年 7 月发布的 第一个 EAP 版本 引入了一个名为 Software... 的配置模型

❯ 阅读更多

配置缓存状态 - 通往 Gradle 9 之路

引言

随着 Gradle 9.0 的临近,我们将分享关于配置缓存的更新——这是一项显著缩短大型项目配置时间的关键功能。在这个主要版本中,我们计划将配置缓存作为首选执行模式,目标是在 Gradle 10.0 中默认启用它。

配置缓存是 Gradle 最受期待的功能之一;进展显著。正如 Gradle 成员 Tony Robalik 指出

“我对 Gradle 为使配置缓存稳定并成为运行构建的首选机制所做的一切工作感到兴奋。在工作中,我们观察到全局启用配置缓存每年将节省大约 4 年的工程时间。配置缓存...

❯ 阅读更多

声明式 Gradle EAP2 - 2024 年 11 月更新

引言

一年前,我们 宣布 了一个名为 Declarative Gradle 的新实验项目。那篇博客文章阐述了我们对 Gradle 声明式模型的愿景。它还介绍了我们以开发人员为中心的软件定义概念。随后,于 2024 年 7 月发布了第一个抢先体验预览版,并附有 Declarative Gradle 初探 博客文章。第一个 EAP 引入了一个名为 Software Types 的配置模型、一种新的 Declarative Configuration Language (DCL),并展示了工具改进和更好的 IDE 支持的潜力。

现在尝试 Declarative Gradle 更加容易。第一个 EAP 基于独立的 Declarative Gradle 原型插件。这些原型插件实现了 Software Types...

❯ 阅读更多

首次接触声明式 Gradle

引言

在我们 2023 年 11 月的更新中,我们 宣布 了一个名为 Declarative Gradle 的新实验项目。那篇文章介绍了我们以开发人员为中心的软件定义理念,以及我们计划如何实现 Gradle 声明式构建语言的愿景。从那时起,我们一直努力工作,以创建 Declarative Gradle 的第一个抢先体验预览版 (EAP)。

这篇博客文章提供了该项目进度的更新,并概述了您如何 尝试、提供反馈并影响我们的下一步。

First look at Declarative Gradle

什么是 Declarative Gradle?

我们对 Gradle 构建工具的愿景之一是提供一种优雅且可扩展的声明式构建语言...

❯ 阅读更多

与 Louis Jacomet 一起走向 Gradle 9

在法国 Devoxx 大会上,我们与 Gradle Inc. 的技术负责人 Louis Jacomet 进行了座谈。Louis 领导着 Gradle 构建工具支持团队并协调发布,因此您经常可以在 GitHub issue 上看到他活跃的身影,并在 Gradle 会议上发表演讲。让我们深入了解 Louis 分享的关于即将发布的 Gradle 9 版本的内容!

alt_text

Devoxx FR 忙碌的一天

周五在 Devoxx FR,路易斯的日程排得满满的,有 4 小时的演讲。他与 Apache Maven 社区的 Hervé Boutemy 共同举办了一个关于驾驭依赖管理迷宫的会议,这是一个长达 1 小时的演讲。他还与他的同事 Paul Merlin 进行了单独的讨论,讨论了即将推出的功能...

❯ 阅读更多

Gradle 与 GitHub 合作保障供应链安全

Gradle 很高兴地宣布与 GitHub 建立技术合作伙伴关系,重点关注多个领域,首先是供应链安全和开发者体验。通过此次合作,我们建立了组织间的直接联系,并计划在 GitHub 和 Gradle 之间进行集成合作,以促进 Gradle 用户采纳最佳安全实践。

作为此次合作发布的首个功能是 Gradle 的依赖项提交 GitHub Action,它可以配置为自动将依赖项提交到 GitHub 的依赖项图谱,帮助用户更好地理解其应用程序并接收 Dependabot 警报。

此次合作将改善共享的 Gradle 和 GitHub 生态系统中许多用户的体验。GitHub 是全球领先的由 AI 驱动的开发者平台,用于构建、扩展和交付安全软件,...

❯ 阅读更多

声明式 Gradle

注意:Declarative Gradle 是一个正在积极开发的实验项目,在实现过程中会频繁发生变化。要了解当前状态,请访问 GitHub 上的 Declarative Gradle 存储库。在此,您可以访问当前文档、原型。订阅 Gradle 构建工具通讯,以每月接收项目更新 - 上次更新于 2024 年 5 月 11 日

我们对 Gradle 构建工具的愿景之一是提供一种优雅且可扩展的声明式构建语言,让开发人员能够以清晰易懂的方式描述任何类型的软件。

Gradle 的构建语言已经在最基本的方式上实现了可扩展,从而带来了高度的灵活性。这是主要原因之一...

❯ 阅读更多

构建配置输入跟踪的改进

配置缓存 是一项显著提高构建性能的功能,它通过缓存配置阶段的结果并将其重用于后续构建。使用配置缓存,当影响构建配置的任何内容(例如构建脚本)未更改时,Gradle 构建工具可以完全跳过配置阶段。

在 Gradle 8.1 中,配置缓存变得稳定并推荐采用。在这种情况下,稳定性意味着行为已最终确定,所有重大更改都遵循 Gradle 弃用流程。通常,如果某个功能现在可以正常工作,它将继续以相同的方式工作——除非行为存在错误并可能导致不正确的构建。虽然某些功能 尚未实现,但大多数用户已经可以受益...

❯ 阅读更多

更简单的 Kotlin DSL 属性赋值

使 Kotlin DSL 成为新 Gradle 构建的默认设置 成为可能的一项改进是使用 惰性属性 赋值的更简单方法。

在这篇博客文章中,我们将解释什么是惰性属性赋值,以及如何在最新的 Gradle 版本中利用新的语法。

什么是惰性属性 API?

惰性属性 API 是 Gradle 的一项功能,它将属性值的计算延迟到需要时。这是编写扩展和任务属性的推荐方式。

提供的一些好处包括

  • 解决配置顺序问题(不再需要 Project.afterEvaluate()
  • 自动跟踪依赖项(无需 Task.dependsOn()
  • 提供标准化访问...

    ❯ 阅读更多

引入测试套件

随着项目的规模和复杂性不断增长,并逐渐成熟,它们往往会积累大量的自动化测试。在 多个粒度级别 测试您的软件对于快速发现问题和提高开发人员生产力至关重要。

Gradle 7.3(于 2021 年 11 月发布)中,Gradle 团队引入了一项名为声明式测试套件的新功能。使用此功能可以更轻松地在单个 Gradle JVM 项目中管理不同类型的测试,而无需担心底层“管道”细节。

为什么选择测试套件?

通常——无论您是否严格遵守测试驱动开发——在开发项目时,您会不断在生产类旁边添加新的单元测试。根据惯例,对于一个 Java 项目,...

❯ 阅读更多

引入 Java 工具链

构建 Java 项目和运行 Gradle 都需要安装 JDK。大多数 Gradle 用户方便地使用运行 Gradle 的 Java 安装来构建和测试他们的应用程序。

虽然这在简单情况下是可以接受的,但这种方法存在一些问题。例如,如果构建要求所有机器都使用相同的 Java 版本,那么每个开发人员都需要了解该要求并手动安装该版本。

已经可以配置 Gradle 使用与运行 Gradle 所用的 Java 版本不同的 Java 版本来构建项目。但是,这需要单独配置每个任务,如编译、测试和 javadoc。

Gradle 6.7 引入了“Java 工具链支持”。简而言之,...

❯ 阅读更多

引入配置缓存

这是关于增量开发系列博客文章的第二篇——增量开发是软件开发过程中频繁进行小幅更改的部分。我们将讨论即将推出的 Gradle 构建工具功能,这些功能将显著改善此用例的反馈时间。在上一篇文章中,我们 介绍了 Gradle 6.5 的文件系统监控

Gradle 6.6 中,我们引入了一个名为配置缓存的实验性功能,它通过缓存 配置阶段 的结果并将其重用于后续构建,显著提高了构建性能。使用配置缓存,当影响构建配置(例如构建脚本)的任何内容未更改时,Gradle 可以完全跳过配置阶段。

...

❯ 阅读更多

引入文件系统监控

这是关于增量开发系列博客文章的第一篇——增量开发是软件开发过程中频繁进行小幅更改的部分。我们将讨论即将推出的 Gradle 构建工具功能,这些功能将显著改善此用例的反馈时间。

此博客文章已在 Gradle 6.7 中该功能投入生产后更新。

在 Gradle 6.5 中,我们引入了一个名为“文件系统监控”的实验性功能,它显著加快了 增量构建 的速度。启用后,它允许 Gradle 在构建之间将文件系统中学到的信息保留在内存中,而不是在每次构建时都轮询文件系统。这显著减少了确定自上次构建以来更改所需的文件系统 I/O 量,...

❯ 阅读更多

更智能的依赖降级

处理传递性依赖项的最大挑战之一是控制它们的版本。流行的库将以传递性依赖项的形式出现在依赖关系图中的多个位置。而且每个路径上的版本信息很可能不同。

通过 多篇博客文章,您已经了解到 Gradle 提供了丰富的功能集来表达复杂的依赖项要求。在这篇文章中,我们将讨论降级依赖项版本时语义的重要性。您还将了解 Gradle 6 的 严格版本 功能,它提供了这种语义信息,并有效地为您提供了处理此复杂问题的 强大而精确 的工具。

在这篇文章中,我们将使用 Google 的 Guava...

❯ 阅读更多

为什么像 Guava 这样的库需要 POM 之外的更多信息

十多年前,Google 发布了一个新的 Java 集合库。这个库,现在被称为 Google Guava,在数月和数年内获得了极大的关注,现在可能是当今生产代码中使用最广泛的 Java 库。

由于 Guava 的广泛采用,许多其他库现在都依赖于它。即使没有直接使用,您也很可能通过传递性依赖在任何相当大的 Java 项目的类路径中找到它。随着越来越多的代码依赖于如此广泛使用的库,冲突的可能性增加,加剧了项目的 依赖地狱

❯ 阅读更多

引入不稳定测试缓解工具

这篇文章介绍了 一个新的 Gradle 插件 和构建扫描改进,旨在缓解您的不稳定测试。

不稳定测试通过阻塞 CI 流水线和导致不必要的故障调查来扰乱软件开发周期。不健康的团队通过重新运行构建,有时甚至多次,来完成更改。Martin Fowler 对 非确定性测试 发表了值得一读的尖锐评论。

要从您的组织中消除这种寄生虫,您必须识别、优先处理并修复您的不稳定测试。

缓解不稳定测试

有许多巧妙的启发式方法可以帮助识别不稳定测试。您可以运行一些静态分析来证明测试失败理论上不会导致给定的测试失败。您可以计算失败的“翻转”次数...

❯ 阅读更多

可选依赖项并非可选

上一篇博客文章 中,我们演示了如何使用 功能 来优雅地解决类路径中存在多个日志框架的问题。在这篇文章中,我们将再次在不同的上下文中使用此概念:可选依赖项

在 Gradle,我们常说没有可选依赖项:只有在您使用特定功能时才需要这些依赖项。让我们解释一下原因。

可选依赖项

直到最近,Gradle 还没有提供任何发布 可选依赖项 的方式,这让一些 Apache Maven™ 用户感到困惑。为了了解可选依赖项在何种上下文中使用,我们来看一个真实的案例。 Apache PDFBox 库在其声明了以下可选依赖项❯ 阅读更多

使用能力解决 Java 日志生态系统的复杂性

Gradle 6.0 带来了许多关于依赖管理方面的改进,我们将在 一系列 博客文章 中介绍。在这篇文章中,我们将通过 能力 的概念探讨类路径上不兼容依赖项的检测。

为了说明这个概念,我们将审视 Java 应用程序和库的日志状态。除了提供 java.util.logging (JUL) 的 Java 核心库之外,开发人员还可以使用许多日志库,例如

❯ 阅读更多

自动对齐平台和 Gradle 模块元数据中的依赖项

这篇博客文章已更新,以反映 Jackson 从 2.12.0 版本开始使用本文的建议发布 Gradle 模块元数据。

在上一篇关于 Gradle 6 依赖管理的 文章 中,我们看到不断增长的构建很快就会陷入依赖地狱。如果意想不到的结果是从依赖图的底部引入并通过传递依赖传播,那么分析起来就特别困难。不幸的是,如果库的作者(构成依赖图底部)有办法在库的元数据中表达关于这些库版本的所有知识,那么其中一些问题就可以避免。

这类库的典型例子是...

❯ 阅读更多

使用 Gradle 6 摆脱依赖地狱

依赖地狱是许多团队面临的一个大问题。项目及其依赖图越大,维护起来就越困难。现有依赖管理工具提供的解决方案不足以有效解决这个问题。

Gradle 6 旨在提供可操作的工具,帮助解决这类问题,使依赖管理更易于维护和可靠。

例如,这是来自真实项目的匿名化依赖图

A large dependency graph

这张图中包含 数百个 不同的库。有些是内部库,有些是开源库。其中一部分模块每周都有多次发布。实际上,对于这种规模的图,你无法...

❯ 阅读更多

介绍 Swift 插件

这篇文章介绍了一些我们一直在开发的新原生插件,它们可以构建 Swift 库和应用程序。它们可以在 macOS 和 Linux 上与 官方 Swift 编译器 一起工作。

这些插件利用了 Gradle 核心中的许多内置功能,例如丰富的依赖管理引擎以及 源依赖构建缓存组合构建更精细的并行执行构建扫描 等等。请注意,不幸的是,这些插件不能直接用于构建 iOS 应用程序和库。

如果您想提供反馈,请 联系我们

构建应用程序

您可以在 Gradle 原生示例 GitHub 仓库中找到本文中的所有示例。让我们来看看如何构建一个 简单的应用程序

❯ 阅读更多

C++ 新插件更新

随着新的 C++ 插件受到早期采用者的更多关注,我们希望向大家更新自我们之前的 C++ 新插件介绍 一文以来的进展。

过去几个月出现了几项新功能、新的和扩展的文档,以及 IDE 支持的改进。

如果您想提供反馈,请 联系我们

新特性

自上次博客文章以来,我们引入了三项主要新功能:C++ 项目的入门模板、目标机器建模和源依赖。

C++ 项目的入门模板

现在,启动一个新的 C++ 项目比以往任何时候都更容易。

得益于 Build Init 插件添加的 init 任务 的 C++ 入门模板,您可以...

❯ 阅读更多

Buildship 中的自动任务执行

如果您使用 Eclipse,您可能熟悉 Buildship,即 Gradle 的 Eclipse 插件。Buildship 3.1 版本允许您 在项目同步时运行任务自动构建,这是 Github 上投票最多的两个问题。在这篇文章中,我们将总结为什么这对许多人来说是一个必不可少的功能,以及如何利用它。

扩展项目同步

Buildship 项目同步功能将 Gradle 项目导入工作区,并将其配置为与 Java 工具链一起工作。当然,这只是冰山一角。还有许多其他工具和框架,Buildship 无法为所有这些工具和框架提供配置。自 3.0 版本以来,有一个❯ 阅读更多

介绍 Gradle 模块元数据

Gradle Module Metadata 在 Gradle 5.3 中达到 1.0 版本,这里我们将解释为什么您应该和我们一样兴奋!

Gradle Module Metadata 的创建是为了解决多年来一直困扰依赖管理的许多问题,特别是(但不限于)Java 生态系统中的问题。它之所以特别重要,是因为 POM 文件(或 Ivy 文件)的丰富程度不足以描述当今软件的现实情况,例如您可能需要区分不同平台的二进制文件,或者在存在多个 API 实现时选择特定的实现。

我们将在本文后面描述更多示例。有些问题可能有变通方法,但这些变通方法是笨拙的甚至是容易出错的。例如,...

❯ 阅读更多

Gradle Kotlin DSL 1.0

最近发布的 Gradle 5.0 包含了 Gradle Kotlin DSL v1.0,现已可广泛使用。

我们希望您能够享受 Kotlin 静态类型系统在 Intellij IDEA 和 Android Studio 中提供的构建编写体验:自动补全、智能内容辅助、快速访问文档、导航到源代码和上下文感知重构。

如果您错过了,可以在 KotlinConf 2018 的 “使用 Gradle Kotlin DSL 进行类型安全构建逻辑” 视频中观看 Paul Merlin 演示这些好处。

如果您喜欢 Groovy 的灵活性和动态特性,那完全没问题——Groovy DSL 不会被弃用。使用...

❯ 阅读更多

引入源依赖项

这篇文章介绍了 Gradle 的一个新依赖管理功能,名为“源依赖项”。

通常,当您声明对某个库的依赖项时,Gradle 会在二进制仓库(如 JCenter 或 Maven Central)中查找该库的二进制文件,并下载二进制文件用于构建。

源依赖项允许您让 Gradle 自动从 Git 检出库的源代码并在您的机器上本地构建二进制文件,而不是下载它们。

我们非常希望收到您对此功能的反馈。请尝试使用它,并告诉我们它的优点以及您遇到的任何问题。您可以在 Gradle 论坛 上留言或在 Gradle native GitHub 仓库中提出问题。

...

❯ 阅读更多

为 Kotlin DSL 1.0 做准备

Gradle Kotlin DSL 1.0 候选版本 已正式发布,并包含在 Gradle 4.10 中。Kotlin DSL 几乎已准备好广泛使用。

我们希望您能享受到 Kotlin 静态类型系统带来的构建编写体验:上下文感知重构、智能内容辅助、可调试的构建脚本以及快速访问文档。如果您还没看过,可以在 这段 KotlinConf 2017 视频 中观看 Rodrigo B. de Oliveira 演示这些好处。

Kotlin DSL 1.0 正式版将随 Gradle 5.0 发布,这是 Gradle 的下一个版本。在 1.0 版本之后,Kotlin DSL 将不再引入任何破坏性更改,除非经过弃用周期。

请尝试 Kotlin DSL 并提交反馈。操作指南...

❯ 阅读更多

演进 Gradle API 以减少配置时间

这篇文章介绍了一种新的 API,用于在构建脚本和插件中声明和配置 Gradle 任务。我们打算让这个新 API 最终取代现有的 API,因为它允许 Gradle 避免配置不必要的构建逻辑。新 API 的使用将很快成为默认推荐,但现有 API 将在几个主要版本中经历我们通常的弃用过程。

我们正在邀请早期采用者试用新的 Gradle 任务 API,以解决任何问题并收集反馈。我们创建了一个 新的用户手册章节,提供了对该功能的快速介绍,并解释了将您的构建迁移到使用新 API 的一些指导方针。

我们欢迎您提供任何反馈...

❯ 阅读更多

引入新的 C++ 插件

这篇文章介绍了一些我们一直在开发的新 C++ 插件。这些插件可以构建 C++ 库和应用程序。它们可以在 macOS、Linux 和 Windows 上与 GCC、Clang 和 Visual C++/Visual Studio 一起工作。

这些插件最终将取代软件模型插件,并利用 Gradle 核心中内置的许多新功能,例如丰富的依赖管理引擎、构建缓存组合构建更精细的并行执行构建扫描 等等。有关背景信息,请参阅我们关于 Gradle 软件模型的状态和未来 的文章。

我们欢迎您对这些插件提出任何反馈意见。您可以在 Gradle 论坛 上留言或在 Gradle 原生 GitHub 存储库中提出问题。

构建应用程序

您可以在 Gradle 原生示例 GitHub 仓库中找到本文中的所有示例。让我们来看看如何构建一个 简单的应用程序

❯ 阅读更多

Gradle 软件模型的现状与未来

我们收到了许多关于 Gradle 软件模型 状态和方向的询问,特别是来自构建原生库和应用程序的用户。

在这篇博客文章中,我们将解释软件模型的现状和未来,特别是它与 Gradle 原生开发的关系。2017 年剩余时间计划进行许多激动人心的改进;请参阅 下面的路线图

软件模型现状

简而言之,软件模型是一种非常声明性的方式,用于描述软件的构建方式以及在此过程中所需的其他组件作为依赖项。它还提供了一个新的、基于规则的引擎来配置 Gradle 构建。当我们开始实现软件模型时,我们为自己设定了以下目标

❯ 阅读更多

超高速 Android 构建

在今天的 Google I/O 大会上,Android Studio 团队发布了基于 Gradle 4.0 M2Android Gradle 插件 3.0 的第一个预览版。它带来了主要的性能改进,特别是对于拥有大量子项目的构建。在这篇博客文章中,我们将解释您可以从这个预览版中期待什么,以及 Android Studio 和 Gradle 团队如何实现这些改进。在深入探讨之前,让我们回顾一下导致当前 Android 构建系统创建的目标。

移动开发的复杂性

与同等规模的传统网络或服务器应用程序相比,开发移动应用程序本质上更为复杂。一个应用程序需要支持各种设备,这些设备具有不同的外设、不同的屏幕尺寸和相对较慢的硬件。流行的免费增值模式又增加了一层多样性,要求应用程序的免费版和付费版具有不同的代码路径。为了为每种设备和目标受众提供快速、精简的应用程序,构建系统需要在前期完成大量繁重的工作。

为了提高开发人员的生产力并减少运行时开销,Android 构建工具提供了多种语言和源代码生成器,例如 Java、RenderScript、AIDL 和 Native 代码。将应用程序及其库打包在一起涉及高度可定制的合并和缩减步骤。Android Studio 团队面临的挑战是自动化所有这些过程,而无需向开发人员暴露底层复杂性。开发人员可以专注于编写他们的生产代码。

❯ 阅读更多

引入 Gradle 构建缓存 Beta 版

Gradle 3.5 中引入,以缩短构建时间。

它有什么作用?

构建缓存会在本地重用 Gradle 任务的输出,并在机器之间共享任务输出。在许多情况下,这将加快平均构建时间。

构建缓存是对 Gradle 增量构建功能的补充,后者优化了尚未构建的本地更改的构建性能。许多 Gradle 任务都设计为 增量式,因此如果任务的输入和输出没有改变,Gradle 可以跳过该任务。即使任务的输入已经改变,某些任务 也只能重新构建已改变的部分。当然,这些技术只有在之前本地构建的输出已经存在的情况下才有效。过去,在全新检出或执行“clean”构建时,需要从头开始构建所有内容,即使这些构建的结果已经在本地或其他机器(例如持续集成服务器)上创建。

现在,Gradle 使用任务的输入作为唯一标识任务输出的键。启用构建缓存功能后,如果 Gradle 可以在构建缓存中找到该键,Gradle 将跳过任务执行,直接将输出从缓存复制到构建目录。这比再次执行任务要快得多。

❯ 阅读更多

宣布 Gradle Enterprise 2017.1

我们很高兴地宣布发布 Gradle Enterprise 2017.1。此版本包含许多新功能和错误修复,进一步扩展了构建扫描为您和您的团队提供的构建洞察。以下是此版本的一些亮点。如果您对演示或试用感兴趣,请 联系我们

轻松查找两次构建之间的依赖项更改

构建之间的依赖项更改是常见的问题来源。例如,升级一个库的版本可能会无意中将不同版本的传递依赖项引入您的项目。反过来,这些更新的版本可能会因与您的项目使用的其他库不兼容而给您带来各种挫败感。

新的构建比较功能允许您快速查找构建之间的依赖项更改,包括传递依赖项中的差异。

❯ 阅读更多

Gradle 3.4 中的增量编译、Java 库插件及其他性能特性

我们非常自豪地宣布,新发布的 Gradle 3.4 显著改进了对 Java 应用程序构建的支持,适用于各种用户。本文将详细解释我们修复、改进和添加的内容。我们将特别关注

  • 极快的增量构建
  • 令人担忧的编译类路径泄露的终结

我们所做的改进可以极大地缩短您的构建时间。以下是我们测量到的结果

基准测试是 公开的,您可以自己尝试,它们是代表消费者报告的真实世界问题的合成项目。特别是,在持续开发过程中,重要的是增量(小改动绝不应该导致长时间构建)

❯ 阅读更多

宣布 Buildship 2.0

我们很高兴地宣布 Buildship 2.0 版本——我们对 Eclipse 的官方 Gradle 支持——现已通过 Eclipse Marketplace 提供。此版本增加了 对组合构建的支持,极大地缩短了开发周转时间。用户界面已根据 1.x 系列期间的大量社区反馈进行了重新设计项目同步现在更加准确,并且 项目导入减少了一个步骤。我们增加了 对 Gradle 离线模式的支持(感谢 Rodrigue!),最后但同样重要的是,第三方集成商可以利用我们 新的 InvocationCustomizer 扩展点。继续阅读以获取每个新功能的详细信息。

复合构建支持

什么是组合构建?

Gradle 中的 组合构建 功能允许您将多个独立的 Gradle 构建作为一个大型多项目构建来处理。当您需要处理通常单独开发的多个项目时,这会极大地缩短周转时间。

假设您编写了一个 Java 库 lib,许多应用程序都在使用它。您发现了一个仅在 special-app 中出现的错误。传统的开发工作流程是在 lib 中更改一些代码并将快照安装到本地仓库。然后,您需要更改 special-app 的构建脚本以使用该新快照并检查错误是否确实已修复。

❯ 阅读更多

构建扫描中的自定义数据

构建扫描是轻松共享构建数据的好方法,但如果您的团队希望将自己的数据添加到这些构建扫描中呢?他们可以!除了构建扫描中自动捕获的大量信息之外,您还可以附加自己的自定义数据,以提供对构建更深入的洞察。此自定义数据可以采用标签、链接和键值格式的任意自定义值的形式。

通过向构建扫描添加自定义数据,您可以轻松查找特定类型的构建,提供指向 GitHub 上适用源代码提交的快速链接,添加有用的 CI 构建信息等等。然后,当您与团队成员共享单个构建扫描链接时,他们可以快速轻松地访问关于您构建的大量信息,从而更轻松地诊断构建环境问题,修复测试失败等等。

如果您对构建扫描还不熟悉,可以在我们的 关于该主题的介绍性博客文章 中了解它们。您还可以在 构建扫描用户手册 中找到更多详细信息,探索一些示例构建扫描尝试这个示例构建扫描项目

现在,让我们来看一些将自定义数据添加到构建扫描的示例(有关 更多示例,请参阅用户手册)。

❯ 阅读更多

引入组合构建

我们并非每天都能宣布一项革命性的软件工程工作流程功能,但今天就是那一天。组合构建,Gradle 3.1 中的一项新功能,开辟了项目组织的一个全新维度。

组合构建是一种 将多个独立的 Gradle 构建连接起来并一起构建 的方式。这句话的简洁性无法完全传达所有新的可能性,所以让我向您展示这将如何让您作为开发人员的生活变得更加轻松。

合并项目

许多组织将其代码库分成几个独立的独立项目,每个项目都有专门的仓库和发布周期。项目之间的集成通过二进制依赖项(例如发布到二进制的 JAR 文件)进行管理...

❯ 阅读更多

引入构建扫描

几个月前,在今年的 Gradle Summit 会议上,我们宣布了 Gradle 平台的一个新部分,名为 Gradle Cloud Services。在这篇文章中,我想向您介绍这些服务中的第一个——Gradle Build Scan Service——以及它所实现的 构建扫描

什么是构建扫描?

构建扫描是您运行构建时捕获的数据的表示。 构建扫描插件 完成捕获数据并将其发送到构建扫描服务的工作。然后,该服务将数据转换为您可以使用并与他人共享的 信息。这是一个使用构建扫描调查故障的快速示例

Publishing and Viewing a Build Scan

❯ 阅读更多

Gradle 3.0 M2:初始 Java 9 支持和性能改进

Gradle 3.0 的第二个里程碑版本 刚刚发布,此版本初步支持 Java 9!

这意味着 Gradle 现在可以在最新的 Java 9 EAP 版本上正常运行,而且您可以使用早期版本的 JDK 9 构建和运行测试。但是,重要的是要了解,虽然您可以使用 JDK 9 编译和测试应用程序,但我们 尚不 支持模块,也不支持任何 JDK 9 特定的编译选项(例如 -release-modulepath)。但是,我们非常乐意收到您自己项目的任何反馈。

❯ 阅读更多

Kotlin 遇见 Gradle

许多读者可能熟悉 JetBrains 出色的 Kotlin 编程语言。它自 2010 年开始开发,于 2012 年首次公开发布,并于今年早些时候发布了 1.0 GA 版本。

多年来,我们一直在关注 Kotlin,并且对其所提供的功能以及其在 Android 社区中的显著采用程度越来越印象深刻。

去年年末,Hans 与 JetBrains 团队的几位同事坐了下来,他们共同思考:基于 Kotlin 编写 Gradle 构建脚本和插件会是什么样子?它如何帮助团队——特别是大型团队——更快地工作并编写结构更好、更易于维护的构建?

这些可能性令人着迷。

❯ 阅读更多

性能就是功能

在 Gradle 公司,我们非常重视构建性能。虽然我们将性能改进捆绑到每个 Gradle 版本中,但我们已经从 Gradle 2.13 开始启动了一项名为 性能爆发 的协同努力,目的是让所有用户更快、更愉快地构建软件。在这篇博客文章中,我们将探讨我们如何处理性能问题,以及在 2.13 版本 及更高版本中预期会有哪些改进。

最快的方式是什么都不做

构建软件需要时间,这就是为什么最大的性能改进是完全消除步骤。这就是为什么,与 Maven 或 Ant 等传统构建工具不同,Gradle 专注于增量构建。你为什么要运行 clean,当...

❯ 阅读更多

引入仅编译依赖项

最受期待的 Gradle 功能之一刚刚在 Gradle 2.12 中到来:支持声明 仅编译依赖项。对于熟悉 Maven 的 Java 开发人员来说,仅编译依赖项的功能类似于 Maven 的 provided 范围,允许您声明仅在编译时使用的非传递性依赖项。虽然 Gradle War 插件 的用户已经可以使用类似的功能,但现在所有使用 Java 插件 的 Java 项目都可以声明仅编译依赖项。

仅编译依赖项解决了许多用例,包括

  • 编译时需要但在运行时从不需要的依赖项,例如仅源代码注解或注解处理器;
  • 编译时需要但在仅使用某些功能时才在运行时需要的依赖项,即 可选依赖项;
  • API 为...

    ❯ 阅读更多

介绍 TestKit:用于功能测试 Gradle 构建逻辑的工具包

自动化测试是实现重构、持续集成和交付等软件开发实践的必要前提。虽然为应用程序代码编写单元测试、集成测试和功能测试已成为行业规范,但可以公平地说,构建自动化领域的测试尚未普及。

但是,为什么我们没有将相同的经过验证的测试实践应用于构建逻辑呢?最终,构建逻辑与应用程序代码一样重要。它帮助我们以自动化、可重现和可靠的方式向客户交付生产软件。跳过测试的原因可能有很多;然而,其中一个突出的原因是用于制定构建逻辑的数据定义格式。在...

❯ 阅读更多

Buildship:从诞生到融入 Eclipse

在 Gradle,我们相信保持开发人员“心流状态”对于构建优秀的软件至关重要。而且因为我们相信心流至关重要,所以我们断言开发人员不必离开 IDE 进行构建,也不必知道哪些功能是由 IDE 执行的,哪些是委托给构建系统的。我们的愿景是所有构建逻辑都完全保留在构建系统中,因此所有计算项目配置、构建项目、运行测试和运行可执行文件的工作都从 IDE 委托给构建系统。因此,IDE 映射构建的项目,可视化构建模型,并显示进度...

❯ 阅读更多

引入持续构建执行

优化构建-编辑-构建循环

过去,我们建议您启用 Gradle Daemon(并在某些情况下 并行执行)以获得 Gradle 的最佳性能。我们还讨论了使用 增量构建 来加快您的构建-编辑-构建反馈循环,通过跳过不必要的工作。现在还有另一种优化可用——它允许您避开,让 Gradle 为您启动构建。

自 2.5 版本起,Gradle 支持 持续构建执行,当检测到输入发生更改时,它会自动重新执行构建。之前有一些社区插件增加了对 Gradle“观察”模式 的支持,它们的功能类似。

对于 Maven,同样的需求需要为每个插件实现...

❯ 阅读更多

引入增量构建支持

任务输入、输出和依赖项

内置任务,如 JavaCompile 声明了一组输入(Java 源文件)和一组输出(类文件)。Gradle 使用此信息来确定任务是否是最新的以及是否需要执行任何工作。如果输入或输出都没有改变,Gradle 可以跳过该任务。总而言之,我们称这种行为为 Gradle 的 增量构建支持

为了利用增量构建支持,您需要向 Gradle 提供有关任务输入和输出的信息。可以配置一个任务只具有输出。在执行任务之前,Gradle 会检查输出,如果输出没有改变,则会跳过任务的执行。在实际构建中,一个任务...

❯ 阅读更多

Gradle 对 Maven POM 配置文件的支持

Maven 配置文件 提供了在某些条件下定制构建时元数据的功能,例如设置了特定的系统属性。一个典型的用例是为不同的运行时环境(例如 Linux 与 Windows)应用特定的配置。例如,正在构建的项目可能在这些不同的平台上需要不同的依赖项。

在 Gradle 项目中实现构建时配置文件

如果您仔细想想,Maven 配置文件在逻辑上不过是有限的 if 语句。Gradle 不需要为此设置特殊的构造。这是为什么呢?Gradle 使用编程语言而不是 XML 来定义构建模型。这使您可以使用编程语言中可用的全部表达范围来定义特定部分的标准,...

❯ 阅读更多