Gradle 5.0 中的新特性

Gradle 5.0 自 4.0 版本以来的新特性。性能、依赖管理以及构建检查和辅助。

Gradle 5.0 是有史以来最快、最安全、功能最强大的 Gradle 版本。

改进的增量编译和增量注解处理建立在坚实的性能基础上,该基础已经具备构建缓存和最新检查功能。

依赖约束、依赖对齐和版本锁定提供了可扩展且灵活的依赖管理模型。

使用 Build Scan™ 服务通过新的性能、依赖管理、日志记录和已弃用 API 使用检查得到了显著改进。

静态类型的 Kotlin DSL 通过在编写构建逻辑时提供代码补全、重构和其他 IDE 辅助,为我们的 IDE 用户带来了耳目一新的体验。

我们已将最近版本的主要改进分为以下几类

最后,您可以继续阅读 如何升级到 Gradle 5.0

更快的构建

缓慢的构建 浪费了大量资金。通过使用 Gradle 5.0 中新的构建缓存和增量处理功能,仅构建您需要的部分,将使开发人员和业务主管感到满意。

升级到 Gradle 5.0 后,您的构建将立即变得更快一些,您可以通过使用和配置本节中描述的其他功能来进一步提高其性能。

增量编译 1000 模块的 Java 项目
配置 1000 模块的 Java 项目

构建缓存

通过重用先前执行的结果来避免工作,使 Gradle 变得快速。Gradle 4.0 引入了 构建缓存,其目的是重用 Gradle 任何先前调用的输出。

如今,Android、KotlinC++、Scala 以及许多其他插件的插件已使任务可缓存,从而可在不同机器之间重用。事实证明,有效使用构建缓存可将构建时间 缩短高达 90%

此外,Gradle 5.0 中的构建缓存也在更多场景中启用,例如当任务声明 Collection 类型的 @OutputDirectories@OutputFiles 时。

增量式 Java 编译

在 Gradle 5.0 中,增量编译器经过高度优化,现在是默认设置。

这是一个极好的消息,因为 CompileJava 任务除了第一次干净构建之外,将无需重新编译所有源文件。

增量式注解处理

Gradle 5.0 中的增量编译器支持 增量注解处理,当存在注解处理器时,可显著提高增量编译的效率。这是一项重要的创新,因为依赖注解处理器的项目越来越多。

为了利用增量注解处理,请确保您升级到已选择此功能的注解处理器的版本。您可以通过 --info 日志记录或在此 常用注解处理器表格中了解给定注解处理器是否为增量式。

使用 新的 annotationProcessor 配置可以轻松管理您的注解处理器并将其添加到注解处理器路径中。

Build Scan™

Build Scan™ 服务通过对性能、依赖管理、日志记录和已弃用 API 使用的新检查得到了显著改进。这是为 Gradle 用户提供的免费服务——只需在命令行执行 Gradle 时添加 --scan 或应用并配置插件即可。

了解更多 - 如何使用 Gradle Build Scan

细粒度传递依赖管理

Gradle 5.0 提供了多项新功能,用于自定义依赖项的选择方式,并改进了对 POM 和 BOM 的支持

  • 依赖约束允许您定义版本或版本范围,以限制直接和传递依赖版本(Maven 不支持)。
  • 平台定义,即 Maven BOM 依赖项得到原生支持,允许导入 Spring Boot 平台定义等,而无需使用外部插件。
  • 依赖对齐允许逻辑组中的不同模块(例如 Jackson 模块)对齐到相同的版本。
  • 现在可以锁定动态依赖版本,以实现更好的构建可重现性。

依赖约束

依赖约束提供了对传递依赖项的强大控制。声明的约束列在改进的 依赖洞察报告Build Scan™ 中。

dependencies {
    implementation 'org.apache.httpcomponents:httpclient'
    constraints {
        implementation('org.apache.httpcomponents:httpclient:4.5.3') {
            because 'previous versions have a bug impacting this application'
        }
        implementation('commons-codec:commons-codec:1.11') {
            because 'version 1.9 pulled from httpclient has bugs affecting this application'
        }
    }
}
dependencies {
    implementation("org.apache.httpcomponents:httpclient")
    constraints {
        add("implementation", "org.apache.httpcomponents:httpclient:4.5.3") {
            because("previous versions have a bug impacting this application")
        }
        add("implementation", "commons-codec:commons-codec:1.11") {
            because("version 1.9 pulled from httpclient has bugs affecting this application")
        }
    }
}

BOM 支持

Gradle 5.0 可以 导入物料清单 (BOM) 文件

dependencies {
    // import a BOM
    implementation platform('org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE')

    // define dependencies without versions
    implementation 'com.google.code.gson:gson'
    implementation 'dom4j:dom4j'
}
dependencies {
    // import a BOM
    implementation(platform("org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE"))

    // define dependencies without versions
    implementation("com.google.code.gson:gson")
    implementation("dom4j:dom4j")
}

此外,Gradle 5.0 在使用 Maven 构建生成的依赖项时提供了更无缝的体验。

  • 在使用 POM 文件时,Gradle 将正确 分离编译和运行时作用域。这避免了由于以前在编译类路径中包含 runtime 依赖项而导致的性能下降和依赖项泄漏。
  • Gradle 现在也支持 POM 中 <parent> 元素中的 版本范围

依赖对齐

依赖版本对齐允许属于同一逻辑组(平台)的不同模块在依赖图中具有相同的版本。

这解决了确保所有 Spring 或 Hibernate 依赖项(适用时)具有相同版本的问题。事实上,许多库是作为一个集合发布的,其中集合中的每个库都具有相同的版本。此功能还有其他用例,因此请点击上面的链接从文档中了解更多信息。

依赖版本锁定

您可以使用 Gradle 5.0 将 动态或范围依赖项锁定到特定版本,以使依赖项解析更具确定性和可重现性。这可以防止传递依赖项的更改意外地破坏您的构建。

编写 Gradle 构建逻辑

您现在可以使用 Kotlin 编写 Gradle 构建脚本。此外,gradle init 已经扩展了项目类型和交互性。

Kotlin DSL 提供 IDE 辅助

自 Gradle 5.0 起,Kotlin DSL 1.0 已可用于生产环境。Kotlin 中的静态类型允许工具提供更好的 IDE 辅助,包括构建脚本的调试和重构、自动补全以及您所期望的一切。

如果您有兴趣使用 Kotlin 编写构建,请从 Gradle Kotlin DSL Primer 开始。

扩展和交互式 gradle init

希望创建新 Gradle 构建的用户有更多项目类型可供选择:kotlin-librarykotlin-application。此外,您可以选择生成 Groovy 或 Kotlin DSL 构建脚本,并自定义项目名称和包。最后,新的交互式 UI 使体验特别愉快。

更易于导航和面向用例的文档

Gradle 文档和入门指南通过以下方式变得更具信息性、可发现性和可访问性

更节省内存的 Gradle 执行

诸如测试的 --fail-fastJVM 应用程序的命令行参数 等功能允许更好的开发工作流,而更低的内存要求缓存清理则减少了 Gradle 在您系统上的开销。

更低的内存要求

您的构建不仅通过升级会更快,而且还将显着减少内存使用。Gradle 5.0 中优化了许多缓存机制,因此 Gradle 进程的默认最大内存 已大大减少

进程类型 Gradle 4.x 默认堆 Gradle 5.0 默认堆
命令行客户端 1 GB 64 MB
Gradle Daemon 1 GB 512 MB
工作进程 物理内存的 1/4 512 MB

定期清理 Gradle 缓存

手动清理数千兆字节旧 Gradle 缓存的日子一去不复返了。Gradle 现在会定期 清理过时的缓存。Gradle 还更精确地跟踪过时的任务输出,并在不清理可能导致错误结果的情况下对其进行清理。

新的 Gradle 调用选项

测试

Gradle 5.0 包括对 JUnit 5 的支持:JUnit Platform、JUnit Jupiter 和 JUnit Vintage。此支持允许您启用 测试分组和过滤,并包含自定义测试引擎。

test {
    useJUnitPlatform {
        excludeTags 'slow'
        includeEngines 'junit-vintage'
        failFast = true
    }
}
tasks.test {
    useJUnitPlatform {
        excludeTags("slow")
        includeEngines("junit-vintage")
        failFast = true
    }
}

您可以使用 --fail-fast 标志来启用更快的红绿循环,Gradle 5.0 默认 首先执行失败的测试,从而进一步改进了这一点。

日志记录

在 Gradle 5.0 中,日志消息现在按照生成它们的任务进行分组,适用于非交互式环境,例如持续集成执行。

除了显示正在执行的测试之外,Gradle 丰富命令行控制台还显示了彩色构建状态,让您一目了然地知道是否有任何测试失败。您还可以要求 Gradle 使用“详细”控制台模式 在任务执行时记录任务

最后,通过配置 warning-mode,可以汇总、静默或展开 Gradle 警告日志。这对于将您的构建升级到 Gradle 5.0 将非常有帮助。

Build Scan™ 弃用视图

复合构建

复合构建允许您包含其他独立项目,例如,您可以同时开发应用程序及其依赖的库。

您现在可以使用 Build Scan™ 检查复合构建。复合构建也与 --continuous 兼容。

它们默认并行构建,现在可以嵌套。

JVM 应用程序的命令行参数

使用 Gradle 5.0 运行带有自定义参数的 Java 应用程序变得容易得多,因为您可以简单地在命令行或通过 IDE 使用 --args 指定它们

新的 Gradle 任务和插件 API

Gradle 5.0 提供了许多新的 API,可实现更快、更通用的构建逻辑。

性能 API

新的 Worker API 允许安全并行和异步执行。

不使用 Worker API
使用 Worker API

改进的任务 I/O

正确声明输入和输出对于正确的增量构建和构建缓存行为至关重要。Gradle 5.0 强制执行更严格的约束,并 引入了新的 API 用于输入/输出声明,帮助您避免正确性问题。

避免配置

有些项目会创建大量的任务。当只有部分任务会被执行时,配置所有任务是没有意义的。Gradle 5.0 的新配置避免 API 正好派上用场。大型项目可以通过在自定义任务中采用这些 API 来节省高达 10% 的配置时间。

发布 API

Gradle 5.0 引入了新的 API,以改善发布到 Maven 和 Ivy 存储库的体验

任务超时

您现在可以 为任务指定超时持续时间,之后它将被中断。

自定义 CLI 参数

Gradle 5.0 为您提供了新的方法,允许用户配置您的自定义任务。

首先,您可以使用 @Option 创建自定义命令行选项。用户可以通过执行 gradle help --task your-task 来发现这些选项。

public class UrlVerify extends DefaultTask {
    private String url;

    @Option(option = "url", description = "Configures the URL to be verified.")
    public void setUrl(String url) {
        this.url = url;
    }

    @Input
    public String getUrl() {
        return url;
    }

    @TaskAction
    public void verify() {
        getLogger().quiet("Verifying URL '{}'", url);

        // verify URL by making a HTTP call
    }
}

自定义嵌套 DSL

以前为任务提供自定义的嵌套 DSL 需要使用内部 API。Gradle 5.0 提供了第一批 嵌套 DSL 元素的 API,为您在考虑用户如何配置任务时提供了更大的灵活性。

Gradle 5.0 提供了围绕 计算(或惰性)任务输入和输出 的额外 API 便利。这使得自定义任务作者无需担心给定属性值何时已知,或避免在任务配置期间进行资源密集型工作,从而可以将 Gradle 模型连接在一起。

如何升级

我们提供了一份 文档来帮助您从 Gradle 4.x 升级到 Gradle 5.0。在升级之前,我们建议您

  • 使用 Gradle wrapper 升级到 Gradle 4.10.3。gradle wrapper --gradle-version=4.10.3
  • 运行 gradle help --scan 列出所有已弃用的 Gradle API 的使用情况及其位置,包括插件。
  • 更新您的 Gradle 插件,尤其是那些在 Build Scan™ 的弃用报告中列出的插件。
  • 升级到 JDK 8 或更高版本,这是运行 Gradle 5.0 所必需的。
  • 如果遇到困难,请参阅 故障排除指南或在 社区论坛上寻求帮助。

您可以通过 Twitter 上的 @gradle 与 Gradle 团队分享反馈。去构建快乐吧!