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

2025 年 4 月,我们发布了声明式 Gradle 的第三个抢先体验预览版 (EAP 3)。了解有关此版本的更多信息,试用示例并分享您的反馈!

目录

简介 #

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

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

我们于 2024 年 7 月发布的 第一个 EAP 版本 引入了一个名为“软件类型”的配置模型,描述了一种新的配置语言,并展示了工具改进和更好的 IDE 支持的潜力。我们于 2024 年 11 月发布的 第二个 EAP 版本 增加了对官方 Android Gradle 插件的支持,并通过 gradle init 提供了使用 DCL 的入门项目。

这篇博客文章提供了项目进度的更新。我们将介绍声明式 Gradle 配置语言 (DCL) 中的新语言特性、改进的测试支持,以及从我们自己的项目中采用声明式 Gradle 中学到的经验。我们还将解释您如何提供反馈并帮助塑造我们接下来构建的内容。

声明式 Gradle 仍处于实验阶段,不适用于生产环境。我们提供第三个抢先体验预览版以收集社区的额外反馈。我们邀请您试用示例并告诉我们您的想法

如果您想了解更多信息,我们将在 2025 年 4 月 24 日举行一次网络研讨会

Declarative Gradle - April 2025 Update

测试支持 #

对于使用 Java 或 Kotlin 的项目,原型插件 已更新,以支持使用 JUnit 等常见测试框架进行简单测试——无需复杂的构建定义。这些原型插件实现了 软件类型,它封装了现有插件(如 Java 插件和 Kotlin Multiplatform (KMP)),使其可以在声明式定义中使用。

在项目文件或设置默认值中,您可以在 testing {} 块内声明对测试框架的依赖项以及任何其他仅用于测试的依赖项

build.gradle.dcl

kotlinJvmLibrary {
    testing {
        dependencies {
            implementation("org.junit.jupiter:junit-jupiter:5.10.2")
            runtimeOnly("org.junit.platform:junit-platform-launcher")
        }
    }
}

测试可以像往常一样从 IDE 或命令行运行。

新的 DCL 语言特性 #

我们继续试验语言特性,以允许更广泛地支持真实世界项目所需的定义,例如列表和文件。

列表支持 #

声明式配置语言支持列表属性。这些属性是字符串、数字、布尔值、文件类型或自定义类型的列表。

列表属性可以使用 = 运算符赋值,也可以使用 += 运算符添加。

要赋值或添加到一个列表属性,请使用 listOf(...) 创建一个列表。要向列表属性添加单个元素,您仍然必须使用 listOf(...)

build.gradle.dcl

javaApplication {
   jvmArguments = listOf("-Xmx512m")
}

列表属性可以在设置中配置默认值,并在项目文件中覆盖。在项目文件中,您可以向在设置中初始化为默认值的列表属性添加元素

settings.gradle.dcl

defaults {
   javaApplication {
      jvmArguments = listOf("-Xmx512m") 
   }
}

build.gradle.dcl

javaApplication {
   jvmArguments += listOf("-Dfoo=bar")
}

在这种情况下,javaApplication.jvmArguments 将包含两个值:[-Xmx512m, -Dfoo=bar],将默认值与项目特定的添加项结合起来。

列表属性,像标量属性一样,在每个块中只能赋值或添加一次。属性的重新赋值被认为是非声明性的,在 DCL 文件中不允许。如果一个属性被多次修改,Gradle 将在评估项目定义时产生错误。

文件支持 #

声明式配置语言支持文件属性。可以使用 layout 为相对于项目目录或设置目录的文件或目录构建路径。

文件属性可以在项目的构建定义中配置

build.gradle.dcl

javaLibrary {
   checkstyle {
      // relative to the project 
      configFile = layout.projectDirectory.file("config/checkstyle.xml") 

      // relative to settings 
      configDirectory = layout.settingsDirectory.dir("config") 
   }
}

这些属性也可以在设置中配置。

至关重要的是,相对于项目目录定义的路径在每个使用该软件类型的单独项目的上下文中进行解释

settings.gradle.dcl

defaults {
   javaLibrary {
      checkstyle {
         // relative to the project 
         configFile = layout.projectDirectory.file("config/checkstyle.xml") 

         // relative to settings
         configDirectory = layout.settingsDirectory.dir("config") 
      }
   }
}

这意味着相同的相对路径会根据应用配置的项目而以不同的方式解析。请注意,layout 不提供对构建目录的访问。

IDE 和工具支持 #

Android Studio 和 IntelliJ IDEA 已更新,以理解列表和文件属性。语法高亮和自动完成现在支持 listOf(...)layout。这是 Android Studio 的视频

VS Code 已更新,以理解列表和文件属性。语法高亮和自动完成现在支持 listOf(...)layout

我们使用独立的 Gradle Client 来展示未来的 IDE 功能。Gradle Client 已更新,以理解列表和文件属性。Gradle 现在提供有关列表属性的单个值定义位置的位置信息。

文件属性与其他属性(字符串、布尔值等)一样处理。在配置模型中选择文件属性将突出显示脚本中设置值的位置。

如以下视频所示,在配置模型中选择一个属性会突出显示设置或项目定义中促成其最终值的行。

迁移我们自己的项目:我们学到了什么 #

作为 EAP3 的一部分,我们尝试将 Gradle Client 项目从 Kotlin DSL 构建逻辑迁移到使用软件类型的 DCL 构建文件。请参阅仓库的 main 分支,了解使用 DCL 的构建文件示例——根目录中的 settings.gradle.dcl 和每个子项目中的 build.gradle.dcl 文件。

我们付出的工作量超出了我们预期,因为声明式 Gradle 完全支持可组合性和可扩展性后,所需工作量将会减少。可组合性和可扩展性允许不同的插件进行交互并扩展软件定义。我们认识到迁移是需要改进的主要领域,我们正在积极探索更改,以便将来更容易进行迁移。

尽管存在这些限制,我们认为声明式 Gradle 已准备好供那些渴望在简单项目中尝试声明式 Gradle 的用户使用。对于感兴趣的人,我们发布了详细的案例研究,描述了我们如何迁移 Gradle Client,以及一份迁移指南,以便入门。

立即试用声明式 Gradle #

如果您想尝试声明式 Gradle,您有两个选择。上述迁移指南和案例研究展示了如何在构建中结合这两个选项。

  1. 如果您的项目足够简单,可以通过我们的原型插件涵盖,那么您只需使用它们配置您的项目。原型软件类型支持编译和测试 Java、Kotlin JVM 和 Android 应用程序,但不包括发布或第三方插件。
  2. 如果您的项目使用第三方插件或发布,您将必须在构建逻辑中编写自己的软件类型。在编写自己的软件类型时,您可以利用 Gradle 插件提供的所有现有灵活性。

声明式 Gradle 仍处于实验阶段,API 可能会更改或删除。您可以向我们提交反馈

尝试声明式 Gradle

接下来是什么? #

在即将发布的版本中,我们计划向配置语言添加对其他数据类型(例如 Map)的支持。我们还将继续改进 IDE 支持和集成。

一项正在进行的关键工作是使声明式 Gradle 具有可组合性和可扩展性。这是本次 EAP 的主要关注领域,但工作尚未完成。我们的目标是允许插件以一种干净、可扩展的方式向现有软件类型贡献新的配置块。

查看我们的路线图以获取更详细的信息。

加入我们 4 月 24 日的网络研讨会! #

加入我们 4 月 24 日的在线研讨会,了解声明式 Gradle 如何重新定义使用 Gradle 构建软件的含义。我们将详细介绍开发者优先的方法,展示实际示例,并分享未来的发展方向。无论您是好奇还是已经在尝试,这都是一个绝佳的机会,可以了解可能性并直接提问。

注册网络研讨会

了解更多 #

来自社区

讨论