Gradle-6.8.3 发布
Gradle团队很兴奋地宣布Gradle 6.8.3。
此版本显著改进了Kotlin DSL构建脚本编译的性能,增加了几个对Java工具链支持的改进,包括供应商选择,并使其易于直接从命令行执行复合构建中的任何任务。此版本还引入了新的一致性解决方案的依赖关系管理API.
这实验配置缓存增加了对Gradle附带的复合版本和更多核心插件的支持。
其他几个丰富在此版本中添加了。
我们预计不会有很多版本受到影响,但是这个版本禁用过时的TLS v1.0版和1.1版协议提高从外部存储库解析依赖项的构建的安全性。
下载连接:点击进入快速下载
升级说明
通过更新您的包装器,切换您的构建以使用Gradle 6.8.3:
./gradlew wrapper --gradle-version=6.8.3
参见Gradle 6.x升级指南了解升级到Gradle 6.8.3时的弃用、重大变更和其他注意事项。
注意:Gradle 6.8已经三补丁版本,修复了原始版本的几个问题。我们建议始终使用最新的补丁版本。
关于Java、Groovy、Kotlin和Android兼容性,请参见完全兼容性说明.
性能改进
Kotlin DSL脚本编译改进
此版本编译了格雷尔·科特林DSL脚本(*.gradle.kts)更快,减少了消耗的内存量,并引入了编译避免,可以完全消除重新编译Kotlin构建脚本的需要。
在一个包含100个子项目的示例构建中,累积的脚本编译时间从大约50秒一直到大约21秒冷缓存和冷守护进程。垃圾收集时间从2.6秒一直到1.3秒。这种改进也减少了内存压力。最重要的是,非ABI的变化可以现在完全消除构建脚本重新编译,节省了那21秒。
到目前为止,任何构建逻辑的变化建筑Src需要重新编译所有的构建脚本。此版本为引入了编译避免格雷尔·科特林DSL剧本。
避免编译将导致Gradle仅在共享构建逻辑的更改影响构建脚本类路径的ABI(应用程序二进制接口)时才重新编译构建脚本。对构建逻辑的私有实现细节的更改,如私有方法或类、非私有方法或类的主体,以及对预编译脚本插件,将不再触发项目生成脚本的重新编译。
避免编译也适用于构建脚本的类路径上的任何JAR中的更改。这包括由包含的构建中定义的插件添加的jar和通过buildscript {}阻止。
虽然对构建的影响可能有所不同,但在编辑Kotlin DSL构建逻辑时,大多数构建的反馈循环可能会明显缩短。
注意:科特林的公共内嵌函数不支持避免编译。如果这样的函数出现在buildscript的类路径上的JAR的公共API中,那么对该JAR中的类的更改将导致Gradle退回到它的旧行为。例如,如果buildSrc包含一个具有公共内联函数的类,那么对buildSrc将导致所有构建脚本被重新编译。
使用运行时类路径的任务的缓存命中率更高
为最新支票和构建缓存,Gradle需要确定两个任务输入属性是否具有相同的值。为了做到这一点,格雷尔首先正常化两个输入,然后比较结果。
运行时类路径分析现在可以智能地检查所有属性文件,忽略注释、空白和属性顺序的差异。此外,您可以有选择地忽略不影响运行时类路径的属性。
normalization {
properties('**/build-info.properties') {
ignoreProperty('timestamp')
}
}
当类路径上的属性文件重新生成或仅在不重要的值上有所不同时,这提高了更新和构建缓存命中的可能性。
看见用户手册了解更多信息。
存在空目录时,缓存命中率会更高
为最新支票和构建缓存,Gradle需要确定两个目录结构是否包含相同的内容。当一个目录包含一个空目录时,它被认为与不存在空目录的相同目录具有不同的内容。
这可能并不总是令人满意的。在许多情况下,只有目录结构中的文件可能是重要的,空目录对任务的输出没有影响。在这种情况下,因为存在空目录而重新执行任务是不必要的,因为它只会产生相同的输出。
引入了新的注释来解决这种情况。输入注释有@输入文件或者@输入目录可以附加注释为@ IgnoreEmptyDirectories指定在生成缓存和最新检查期间不应考虑目录。对于以这种方式标注的输入,只有对文件(包括文件路径)的更改才会被视为输入值的差异。
class MyTask extends DefaultTask {
@InputFiles
@PathSensitive(@PathSensitivity.RELATIVE)
@IgnoreEmptyDirectories
FileCollection inputFiles;
}
类似地,也有相应的运行时API等价物:
tasks.register("myTask") {
ext.inputFiles = files()
inputs.files(inputFiles)
.withPropertyName('inputFiles')
.withPathSensitivity(PathSensitivity.RELATIVE)
.ignoreEmptyDirectories()
}
源任务, JavaCompile, GroovyCompile,以及AntlrTask已全部更新,现在在进行最新检查和构建缓存键计算时会忽略空目录。
看见用户手册了解更多信息。
配置缓存改进
这配置缓存通过缓存配置阶段的结果来提高构建性能。使用配置缓存,当没有任何影响构建配置的内容发生变化时,Gradle可以完全跳过配置阶段。
阅读…的文章此功能及其影响在格雷尔的博客上。您还可以在中跟踪配置缓存支持的进度核心插件和社区插件.
支持复合构建
从这个版本开始,复合构件配置缓存完全支持。
更多支持的核心插件
在此版本中,所有核心代码分析插件都完全支持配置缓存:
- checkstyle
- pmd
- codenarc
- jacoco
参见支持的核心插件矩阵在用户手册中。
安全改进
默认情况下,不再启用过期的TLS版本
此版本的Gradle从默认的允许协议列表中删除了TLS协议v1.0和v1.1。在解决依赖关系时,Gradle将不再默认回退到TLS v1.0或v1.1。默认情况下,只允许TLS v1.2或TLS v1.3。
通过手动指定系统属性,可以重新启用这些TLS版本https.protocols用逗号分隔您的版本所需的协议列表。
绝大多数构建应该不需要以任何方式进行更改。Maven Central和JCenter/Bintray2018年停止支持TLS v1.0和TLS v1.1。从Java 7开始,Java就有了TLS v1.2。在Gradle中禁用这些协议可以保护构建免受降级攻击。
根据您使用的Java版本,Gradle在与远程存储库通信时会协商TLS v1.2或TLS v1.3。
注意:JDK 11和JDK 12的早期版本包含中的竞态条件错误TLSv1.3处理逻辑这导致了异常javax.net.ssl.SSLException: No PSK available. Unable to resume。如果您遇到此问题,我们建议您更新到最新的次要JDK版本。
已修复问题
1个问题已在Gradle 6.8.3中修复。
[#16144] -当使用不同的规范化配置对jar进行哈希处理时,构建缓存未命中