Gradle Release Notes

Version 6.0.1

The Gradle team is excited to announce a new major version of Gradle, 6.0.1.

此版本的主要亮点是依赖性管理中的功能集大大改进 . 其中一些功能是分阶段发布的,但是在Gradle 6.0中,它们是稳定的并且可以投入生产. 我们默认发布Gradle模块元数据 ,这使这些新功能在项目二进制依赖关系之间可用.

在JVM生态系统中,我们使增量Java和Groovy编译更快 ,增加了对JDK13的支持,并提供了对Javadoc和源jar的开箱即用的支持 . 对于Scala项目,我们更新了Zinc编译器 ,并使选择使用哪个版本的Zinc更容易.

对于Gradle 插件作者 ,我们添加了新的API,以使将任务和属性延迟连接在一起变得更加容易, 使有用的服务可用于worker API动作,并且如果任务配置不当 ,Gradle会在运行时抱怨 .

原生生态系统中 ,我们添加了对Visual Studio 2019和最新C ++标准的支持.

此版本包含一些更新,以帮助保护构建的完整性和安全性 .

与往常一样,我们还合并了一些较小的更改许多其他固定的问题 .

该版本的功能全面变化,但是这些发行说明仅列出了自Gradle 5.6以来的新功能. 您可以在此处查看Gradle 5.0以后亮点 .

我们要感谢此Gradle版本的以下社区贡献者:

内森强罗伯托·佩雷斯阿尔科莱亚丹尼尔·圣地亚哥哲池永塞巴斯蒂安Schuberth安德烈Mischenko石原慎太郎片渊亚历克斯Saveau迈克Kobit汤姆Eyckmans阿图尔Dryomovszhem奈杰尔银行谢尔盖Shatunov丹Sănduleac弗拉基米尔·西特尼科夫罗斯戈德堡jutoft罗宾Verduijn佩德罗托雷斯迈克尔·贝里叶夫根尼·Mandrikovlingocoder罗伯特Stupp普雷德拉格·克内热维奇 .

Table Of Contents

Upgrade Instructions

通过更新包装器,将构建切换为使用Gradle 6.0.1:

./gradlew wrapper --gradle-version=6.0.1

请参阅升级指南,以了解升级到Gradle 6.0.1时的弃用,重大更改和其他注意事项.

注意 :Gradle 6.0的一个修补程序版本修复了多个问题 . 我们建议始终使用最新的修补程序版本.

Compatibility Notes

执行Gradle需要8到13之间的Java版本. 尚不支持Java 14和更高版本.

Java 6和7仍可用于编译和派生测试执行 . 就像Gradle 5.x一样,任何受支持的Java版本都可以用于编译或测试.

此版本的Gradle经过测试

其他版本可能会或可能不会.

Dependency management improvements

依赖关系管理文档已重新整理并围绕用例进行组织,以帮助用户更快地找到所需的信息. 我们改进了术语部分,以解释常用术语.

现在,使用maven-publishivy-publish插件时,Gradle模块元数据发布是默认设置.

下面的许多功能取决于Ivy或Maven POM文件中找不到的其他元数据的产生或使用.

Sharing dependency versions between projects

Gradle提供了一种在平台之间推荐和共享版本的简便方法.

使用Gradle平台,可以使用更多有关版本声明的上下文,可以建议版本并强制使用严格的版本.

为了实现互操作性,构建还可以利用与Maven BOM的集成 .

Handling mutually exclusive dependencies

Gradle使用组件功能允许插件和构建来检测和解决互斥依赖关系之间的实现冲突 .

JVM世界中一个著名的示例是竞争性日志记录实现. 组件功能使构建可以配置要选择的依赖项.

Upgrading versions of transitive dependencies

依赖关系管理的问题通常与处理传递性依赖关系有关. 开发人员通常会通过添加直接依赖项来错误地解决传递依赖项问题. 为了避免这种情况,Gradle提供了依赖关系约束的概念来影响可传递依赖关系的版本 .

Aligning versions across multiple dependencies

依赖关系版本对齐允许内部版本表示不同的模块属于同一逻辑组(例如平台),并且在依赖关系图中需要具有相同的版本(也称为aligned ).

JVM世界中的一个著名示例是Jackson库.

Expressing intent with context

声明依赖项时,构建可以为 Gradle 提供有关其版本的更多上下文 ,包括范围内的版本首选项,严格的版本要求或拒绝的版本. 开发人员还可以提供为什么使用或需要依赖项的可读说明.

Tweak published metadata

Gradle允许构建使用以前无法发布的信息来修复或丰富传统元数据 ,例如依赖关系约束,丰富版本,功能和变体. 这些称为组件元数据规则 .

组件元数据规则还可以将其他已发布的工件映射到新的Gradle变体.

Modeling feature variants and optional dependencies

Gradle提供了对库的可选功能进行建模的功能 . 每个功能都可以具有自己的一组依存关系,并且可以分别使用.

借助功能变体,Gradle为创建和发布测试装置提供了一流的支持. 测试夹具可以由多项目构建中的其他项目使用.

Built-in javadoc and sources packaging and publishing

现在,您可以为Java库或Java项目激活Javadoc和源发布:

java {
    withJavadocJar()
    withSourcesJar()
}

使用maven-publishivy-publish插件,它不仅会自动创建和发布-javadoc.jar-sources.jar ,还将发布这些信息作为Gradle Module元数据中的变体而存在. 这意味着您可以查询模块的Javadoc或源代码变体 ,还可以检索其依赖项的Javadoc(或源代码).

如果激活,则Java和Java库项目将自动提供javadocJarsourcesJar任务.

Faster incremental Java and Groovy compilation

现在,当分析更改的类的影响时,增量编译器可以排除作为另一个类的实现细节的类. 这限制了需要重新编译的类的数量.

For instance, if you have:

class A {}

class B {
    static void foo() {
        A a = new A();
        // ... use A
    }
}

class C {
    void bar() {
        B.foo();
    }
}

更改A后,Gradle先前会重新编译所有3个源文件,即使B更改方式不需要重新编译C

在Gradle 6.0中,Gradle将仅重新编译AB 对于深层依赖链,这可能会大大减少需要在编译任务中重新编译的文件数量.

如果ABC都在不同的项目中,则Gradle将通过避免编译跳过C重新编译 .

这是由Robert Stupp贡献的.

Support for Java 13

Gradle现在支持使用Java 13运行.

Update to newer Scala Zinc compiler

Zinc编译器已升级到版本1.3.0. Gradle不再支持为Scala 2.9构建.

这修复了一些Scala增量编译错误并提高了性能.

Gradle支持的最小Zinc编译器为1.2.0,最大测试版本为1.3.0.

为了使选择Zinc编译器的版本更加容易,您现在可以配置一个zincVersion属性:

scala {
    zincVersion = "1.2.1"
}

请注意,自Zinc 1.0起,受支持的Zinc版本的坐标已更改. 如果您尝试使用com.typesafe.zinc:zinc编译器,则Gradle将切换到具有默认版本(1.3.0)的新Zinc实现.

这最初是由PredragKnežević贡献的.

Problems with tasks called out during build

在运行增量构建或使用构建缓存时,错误定义其输入或输出的任务会导致问题. 为了解决这些问题,Gradle现在在构建期间将这些问题报告为弃用警告.

当检测到问题时,Gradle在使用--warning-mode=all运行时将显示警告:

> Task :myTask
Property 'inputDirectory' is declared without normalization specified. Properties of cacheable work must declare their normalization via @PathSensitive, @Classpath or @CompileClasspath. Defaulting to PathSensitivity.ABSOLUTE. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.
Property 'outputFile' is not annotated with an input or output annotation. This behaviour has been deprecated and is scheduled to be removed in Gradle 7.0.

不管使用什么命令行参数,弃用警告将始终显示在构建扫描中 .

有关如何处理这些弃用警告的信息,请参见用户手册.

Security improvements

Protecting the integrity of builds

现在,在解决依赖关系,从远程构建缓存中提取缓存命中,检索文本资源以及使用不安全的HTTP协议应用脚本插件时,Gradle现在将发出弃用警告.

我们鼓励所有用户切换到使用HTTPS而不是HTTP. 您可以从Lets Encrypt获得用于工件服务器的免费HTTPS证书. HTTPS的使用对于保护您的供应链和整个JVM生态系统非常重要.

For users that require the use of HTTP, Gradle has several new APIs to continue to allow HTTP on a case-by-case basis.

对于存储库:

repositories {
    maven {
        url = "http://my-company.example"
        allowInsecureProtocol = true
    }
    ivy {
        url = "http://my-company.example"
        allowInsecureProtocol = true
    }
}

对于脚本插件:

apply from: resources.text.fromInsecureUri("http://my-company.example/external.gradle")

新的API:

Deprecation of HTTP services

从2020年1月13日到2020年1月15日,JVM生态系统中使用最广泛的工件服务器将放弃对HTTP的支持,仅支持HTTPS. 他们的公告可以在下面找到:

我们将停止与Gradle提供的服务一起使用HTTP .

Signing Plugin now uses SHA512 instead of SHA1

A low severity security issue was reported in the Gradle signing plugin.

可以在下面找到更多信息:

这是弗拉基米尔·西特尼科夫Vladimir Sitnikov )贡献的.

Publication of SHA256 and SHA512 checksums

如果您使用maven-publishivy-publish插件,那么Gradle现在将自动上传SHA256和SHA512签名,以及传统但不安全的MD5和SHA1签名.

推荐使用的maven插件支持SHA256和SHA512文件的发布,但可以与Ivy存储库的旧版uploadArchives任务一起使用.

此外,Gradle模块元数据文件还包含有关引用工件的SHA256和SHA512校验和.

从6.0.1开始,如果您的外部存储库不支持SHA256和/或SHA512校验和,则可以禁用这些校验和的上载:

Support for in-memory signing with subkeys

Gradle现在支持带有子项的内存中签名 .

这是由szhem贡献的.

Usability improvements

Automatic shortening of long command-lines for Java applications on Windows

当Gradle检测到Java进程命令行将超过Windows的32,768个字符限制时,Gradle将尝试通过" classpath jar"传递Java应用程序的类路径来缩短命令行.

类路径jar包含带有应用程序完整类路径的清单. Gradle只会将命令行上生成的jar传递给应用程序. 如果命令行仍然太长,则Java进程将无法像以前一样启动.

如果命令行不需要缩短,Gradle将不会更改Java进程的命令行参数.

More consistent & robust file deletion on Windows

在Windows上删除复杂的文件层次结构有时会失败,并显示诸如" Unable to delete directory ...类的错误. 过去,Gradle在删除文件的某些(而非全部)情况下使用变通方法.

Gradle现在以一致的方式删除文件,这应避免在清理任务的输出文件时失败.

Windows line endings: gradle init generates .gitattributes file

为了确保Windows批处理脚本保留适当的行尾, gradle init现在会生成一个.gitattributes文件.

这是汤姆·埃克曼斯Tom Eyckmans )贡献的.

Wrapper reports download progress as percentage

Gradle现在报告下载分发的进度.

最初由Artur Dryomov贡献.

Wrapper tries to recover from an invalid Gradle installation

如果包装器确定包装器安装的Gradle发行版无效,则包装器将尝试重新安装该发行版. 包装器的早期版本可能会失败,并且需要手动干预.

Daemon logs contain the date and timestamp

将消息记录到Gradle守护程序日志中时,我们的日志格式仅包含时间,而不包含日期.

Gradle现在使用ISO-8601日期时间戳记录日志.

Features for plugin authors

New types available as managed properties

Gradle 5.5引入了任务和其他类型托管属性的概念. Gradle提供了托管属性的getter和setter的实现. 通过删除大量样板,可以简化插件的实现.

在此版本中,任务或其他自定义类型可能具有类型ConfigurableFileTreeNamedDomainObjectContainer<T>的抽象只读属性.

New ConfigurableFileTree and FileCollection factory methods

以前,只能通过使用Project提供的API创建ConfigurableFileTree或固定的FileCollection . 但是, Project对象并非总是可用的,例如在项目扩展对象或辅助动作中 .

现在, ObjectFactory服务具有用于创建ConfigurableFileTree实例的fileTree()方法.

DirectoryDirectoryProperty类型都有一个新的files(Object...)方法来创建固定的FileCollection实例,以解析相对于所引用目录的文件.

有关如何注入服务以及如何使用惰性属性的文件,请参见用户手册.

Injectable FileSystemOperations and ExecOperations services

同样,只能通过使用Project提供的API来执行文件系统操作,例如copy()sync()delete()或通过exec()javaexec()运行外部进程. 现在,当Project实例不可用时,两个新的可注入服务允许执行所有操作.

有关更多详细信息和示例,请参阅用户手册以了解如何注入服务以及FileSystemOperationsExecOperations api文档.

Services available in Worker API actions

现在,可以在使用Worker APIWorkAction类的任务中注入以下服务:

可以通过将这些服务添加到WorkAction实现的构造函数参数中来注入这些服务:

abstract class ReverseFile implements WorkAction<ReverseParameters> {
    private final FileSystemOperations fileSystemOperations

    @Inject
    public ReverseFile(FileSystemOperations fileSystemOperations) {
        this.fileSystemOperations = fileSystemOperations
    }

    @Override
    public void execute() {
        fileSystemOperations.copy {
            from parameters.fileToReverse
            into parameters.destinationDir
            filter { String line -> line.reverse() }
        }
    }
}

有关将服务注入自定义Gradle类型的更多信息,请参见用户手册 .

New convenience methods for bridging between a RegularFileProperty or DirectoryProperty and a File

Features for native developers

IntelliSense support for C++17 and latest C++ standard within Visual Studio

Gradle现在将生成IDE解决方案,以纪念C ++ 17 /std:cpp17和最新的C ++标准/std:cpplatest编译器标志.

Visual Studio IntelliSense将帮助您使用这些新标准编写出色的代码.

Support for Visual Studio 2019

Gradle现在支持使用Visual Studio 2019构建应用程序和库.

Features for Gradle tooling providers

Test output as progress event

最新Tooling API的用户可以侦听包含测试输出的新TestOutputEvent进度事件类型. 这样,工具提供者可以使用TestLauncher API启动测试并即时显示测试输出.

升级功能是在Gradle的早期版本中提供的功能,但现在受支持并具有向后兼容性. 有关更多信息,请参见" 功能生命周期 "中的"用户手册"部分.

以下是此Gradle版本中已增强的功能.

C++ and Swift support

我们推广了所有新的本机插件(即cpp-applicationcpp-librarycpp-unit-testswift-applicationswift-libraryxctestvisual-studioxcode ). 请注意,所有软件模型插件都将被淘汰,而不是被升级.

New incremental tasks API

InputChanges用于实现增量任务的新InputChanges API. 有关更多信息,请参见用户手册 .

IDE integration types and APIs.

我们在Gradle 5.5之前引入的idetooling-api子项目中推广了所有API元素.

Some long existing incubating features have been promoted

Fixed issues

Known issues

已知问题是在发行后发现的与该发行版中的更改直接相关的问题.

External contributions

我们喜欢从Gradle社区获得捐助. 有关贡献的信息,请访问gradle.org/contribute .

Reporting Problems

如果您发现此发行版有问题,请遵循我们的发行准则在GitHub Issues上提交错误. 如果您不确定遇到错误,请使用论坛 .

我们希望您能通过Gradle建立幸福,并且期待您通过TwitterGitHub的反馈.

by  ICOPY.SITE