​Gradle 5.0 正式版发布了​​,官方表示这是史上最快、最安全,最强大的版本,且没有之一。改进的增量编译和增量注释处理构建在已经具有构建缓存和最新检查功能的可靠性能基础之上。依赖对齐和版本锁定提供了可扩展且灵活的依赖管理模型。通过新的性能和依赖关系管理、日志记录和弃用的 API 使用检查,构建扫描得到了显著的改进。静态类型的 Kotlin DSL 可在创建构建逻辑时提供代码完成、重构和其他的 IDE 辅助。

根据官方文档介绍,此次更新主要带来了如下几个方面的改进:
​​​更快的构建​​​​细粒度的传递依赖管理​​​​编写 Gradle 构建逻辑​​​​更高效的内存执行​​​​新的 Gradle 调用选项​​​​新的 Gradle 任务和插件 API​

更快的构建

缓慢的构建过程既浪费钱又浪费精力,而通过使用Gradle 5.0中的新构建缓存和增量处理特性,将使得构建过程带来质的提升。

升级到Gradle 5.0之后,您的构建速度将明显提升,您还可以通过使用和配置本节中描述的其他特性来进一步提高构建的性能。

Gradle 5.0 正式版发布_缓存

构建缓存

通过重用构建缓存来避免重复的构建工作,这使得Gradle的构建将非常快,Gradle 4.0引入了构建缓存,其目的是重用以前调用Gradle时的输出。

现在,Gradle 5.0可以用于Android、Kotlin、c++、Scala和许多其他插件的插件,使得任务可以缓存,因此可以跨不同的机器重用。有效地使用构建缓存可以将构建时间减少90%左右。

此外,Gradle 5.0中的构建缓存在很多场景中也是启用的,例如当一个任务声明一个@ outputdirectory或@OutputFiles集合时。

Gradle 5.0 正式版发布_缓存_02

Java增量编译

在Gradle 5.0中,增量编译器是经过高度优化的,且默认使用增量编译功能。这是一个非常棒的消息,因为编译java任务不需要重新编译所有的源文件,除了第一次之外,这将大大的提供代码编译的效率。

增量注解处理

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

要利用增量注解处理,请确保升级到选择该特性的注解处理程序版本。您可以通过info日志记录或查看注解处理程序来发现给定的注解过程是否具有支持增量功能。

使用新的annotationProcessor配置可以方便地管理注解处理器,并将它们放到注解处理器路径上。

构建扫描

通过对性能、依赖管理、日志记录和废弃api的使用进行新的检查,构建扫描有了显著的改进。这是一个免费的服务,主要提供给Gradle用户在需要添加扫描时使用,在命令行上执行Gradle或应用和配置即可构建扫描。

细粒度的传递依赖管理

Gradle 5.0提供了几个新的特性来定制如何选择依赖项,以及改进的POM和BOM支持:

  • 依赖约束允许您定义版本或版本范围,从而限制和传递依赖版本(Maven不支持)。
  • 平台定义(又称Maven BOM依赖项)是本地支持的,它允许在不使用外部插件的情况下导入Spring之类的东西。
  • 依赖项对齐允许逻辑组中的不同模块(例如Jackson模块)对齐到相同的版本。

依赖约束

依赖约束提供了对传递依赖项的可靠性控制,已声明的约束列在改进的依赖关系洞察报告和构建扫描中。例如,下面是常见的Groovy依赖脚本:

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'
}
}
}

OM支持

Gradle 5.0可导入BOM文件,bom (bill of materials) 可以有效解决同一项目,不同版本依赖的问题。

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将正确地分离编译和运行时范围。这可以有效的避免由于以前在编译类路径中包含运行时依赖项而导致的性能下降和依赖项泄漏问题。
  • Gradle现在也可以用在< pom>元素中。

依赖对齐

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

这确保所有Spring或Hibernate依赖项具有相同版本的问题。事实上,有许多库是以集合的形式发布的,集合中的每个库具有相同的版本。

依赖版本锁定

您可以使用Gradle 5.0将动态或远程依赖项锁定到特定的版本,从而使依赖项解析更加确定和可重现,这可以防止依赖项的更改带来地破坏构建问题。

编写 Gradle 构建逻辑

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

Kotlin DSL帮助信息

Kotlin DSL 从1.0版本便提供了对Gradle的支持。Kotlin中的静态类型允许工具提供更好的IDE帮助,包括调试和重构构建脚本、自动完成和您期望的其他一切。

如果您对用Kotlin编写构建感兴趣,可以从​​Gradle Kotlin DSL入门开始​

Gradle 5.0 正式版发布_依赖管理_03

扩大和互动

希望使用Gradle构建项目的用户可以选择其他项目类型一起使用,如kotlin-library和kotlin-application。此外,您可以选择生成Groovy或Kotlin DSL构建脚本,并自定义项目名称和包。

Gradle 5.0 正式版发布_依赖管理_04

更有指导性的文档

此外,Gradle文档和入门指南提供了更多的信息,并且更容易发现和访问,主要体现在:

  • 改进了包括入门、故障排除、CLI引用、管理传递依赖关系,以及其他一些的一些页面。
  • 由Algolia DocSearch托管的可搜索参考文档。
  • 一个重新格式化的PDF供离线查看。
  • 分类导航。
  • 文档版本选择。

更高效的内存执行

更高效的内存执行命令行参数等特性允许更好的开发工作流,同时降低内存需求和缓存清理可以减少Gradle在系统上的开销。

更低的内存要求

升级Gradle 5.0 不仅会使构建速度更快,而且还会大大减少内存的使用。许多缓存机制在Gradle 5.0中得到了优化,并且Gradle进程的默认最大内存大大减少。

Process Type

Gradle 4.x default heap

Gradle 5.0 default heap

Command-line client

1 GB

64 MB

Gradle Daemon

1 GB

512 MB

Worker processes

1/4 of physical memory

512 MB

阶段性缓存清理

现在,手动清理缓存的日子已经结束了,Gradle现在可以实现定期清理过期缓存。Gradle还更精确地跟踪陈旧的任务输出,并在不导致错误结果的情况下清理它们。

新的 Gradle 调用选项

JUnit 测试

Gradle 5.0添加了对JUnit 5测试的支持:JUnit平台、JUnit Jupiter和JUnit Vintage。这将支持允许您启用测试分组和筛选,并包括定制的测试引擎。

test {
useJUnitPlatform {
excludeTags 'slow'
includeEngines 'junit-vintage'
failFast = true
}
}

您可以使用fail-fast标志来启用一个更快的红绿循环,默认情况下,第5.0版本将首先执行失败的测试,这进一步改进了该标志。

日志

在Gradle 5.0中,日志消息可以按照非交互环境(如持续集成执行),进行日志消息的任务分组。

除了显示正在执行哪些测试之外,Gradle丰富的命令行控制台还显示了一个彩色的构建状态,可以一眼就看出是那些测试失败的情况。您还可以要求Gradle在任务使用“详细”控制台模式执行时记录它们。

最后,通过配置警告模式,Gradle还可以总结、沉默或扩展Gradle警告日志。

Gradle 5.0 正式版发布_自定义_05

复合构建

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

现在您还可以使用构建扫描检查复合构建。复合构建还可以与continuous兼容。默认情况下它们是并行构建的,现在可以嵌套了。

JVM命令行参数

使用Gradle 5.0运行带有自定义参数的Java应用程序将比其他版本容易得多,因为您可以在命令行上或通过IDE简单地使用它们。

新的 Gradle 任务和插件 API

Gradle 5.0提供了许多新的api,这些api支持更快、更通用的构建逻辑。

高性能API

新的Worker API将允许您安全的并行和异步执行任务。按照我们的指南,使用Worker API为自定义任务启用更快的构建任务,下图展示了使用Worker API和不是也Worker API的区别。

Gradle 5.0 正式版发布_缓存_06

改进的I/O任务

正确声明输入和输出对于增量构建和构建缓存行为至关重要。Gradle 5.0加强了约束,并为输入/输出声明引入了新的api,这些api可以帮助您避免一些低级问题。

Gradle 5.0 正式版发布_自定义_07

避免冗余配置

有些项目在执行过程中会产生很多的任务,当只执行一些操作时,配置所有这些操作是没有意义的。这就是Gradle 5.0的新配置避免api的神奇之处。通过在自定义任务中采用这些配置,大型项目可以节省高达10%的配置时间。

Gradle 5.0 正式版发布_依赖管理_08

APIs

Gradle 5.0引入了新的api来改进对Maven和Ivy存储库的管理。主要包括:

  • 签名插件支持对发布的所有工件签名。
  • 发布了配置范围内的依赖项排除。
  • Maven发布和Ivy发布插件提供类型安全的dsl来定制作为发布的一部分生成的pom或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

为使用内部api的任务Gradle提供自定义的嵌套DSL。Gradle 5.0为嵌套DSL元素提供了一流的api,在考虑用户如何配置任务时提供了更大的灵活性。

Gradle 5.0为计算(或延迟)任务输入和输出提供了额外的API便利。这使得自定义任务时能够将Gradle模型连接在一起,而不用担心给定的属性值被修改,也不用担心在任务配置期间会避免资源密集型工作。

升级指南

为了升级到5.0版本。升级前,我们给出如下一些建议:

  • 使用Gradle包装器升级到Gradle 4.10.2。
  • 运行gradle帮助:扫描列出所有不推荐使用的gradle api及其位置,包括插件。
  • 更新您的Gradle插件,特别是那些在构建扫描的警告的插件。
  • 升级到JDK 8或更高版本,需要运行Gradle 5.0。

如果遇到问题,请参阅故障排除指南或联系社区论坛,您也可以参考我们给出的​​升级文档​​。

参考:​​Gradle 5.0都有哪些新特性​