天天看點

Gradle 5.0 新特性介紹

本文翻譯自官網 :https://gradle.org/whats-new/gradle-5/

Gradle 5.0是最快、最安全、功能最強的Gradle版本。

改進的增量編譯和增量注釋處理建立在堅實的性能基礎之上,這些性能基礎已經提供了建構緩存和最新的檢查功能。

依賴限制、依賴對齊和版本鎖定提供了可伸縮和靈活的依賴管理模型。

通過新的性能、依賴管理、日志記錄和廢棄的API使用檢查,建構掃描有了顯著的改進。

我們将最近版本中的主要改進分為以下幾類:

  • 更快的建構
  • 細粒度的傳遞依賴關系管理
  • 編寫Gradle建構邏輯
  • 更高效的記憶體級别執行
  • 新的Gradle調用選項
  • 新的Gradle任務和插件api

在文章末尾,您可以進一步了解如何更新到5.0。

更快的建構

緩慢的建構會浪費很多錢。通過使用Gradle 5.0中的新建構緩存和增量處理特性,隻建構你需要的東西,

你和你的主管都會很高興。

在更新到Gradle 5.0之後,你的建構已經快了一些,你可以通過使用和配置本節中描述的其他特性來進一步提高它們的性能。

Gradle 5.0 新特性介紹
Gradle 5.0 新特性介紹
1.Build caching

通過重用以前執行的結果來避免工作,這使得Gradle非常快。Gradle 4.0引入了建構緩存,其目的是重用以前調用Gradle時的輸出。

今天,用于Android、Kotlin、c++、Scala和許多其他插件的插件使得任務可以緩存,是以可以跨不同的機器重用。有效地使用建構緩存可以将建構時間減少90%。

此外,Gradle 5.0中的建構緩存在更多的場景中也是啟用的,例如當一個任務聲明一個

@ outputdirectory

@OutputFiles

集合時。

2.增量Java編譯

在Gradle 5.0中,增量編譯器是高度優化的,并且是預設開啟的。

這是一個非常棒的消息,因為編譯java任務不需要重新編譯所有的源檔案,除非你clean了項目後的第一次編譯。

3.增量注解處理

5.0中的增量編譯器支援增量注解處理,當有注解處理程式時,顯著提高了增量編譯的效率。這是一個重要的創新,因為依賴注解處理器的項目越來越多。

要利用增量注解處理,請確定更新到選擇該特性的注解處理程式版本。您可以通過

--info

日志記錄或在這個流行的注釋處理程式表中發現給定的注釋過程是否是增量的。

https://github.com/gradle/gradle/issues/5277

使用新的annotationProcessor配置可以友善地管理注釋處理器,并将它們放到注釋處理器路徑上。

4.建構掃描

通過對性能、依賴管理、日志記錄和廢棄api的使用進行新的檢查,建構掃描有了顯著的改進。這是一個免費的服務,提供給Gradle使用者-隻需添加

--scan

時,在指令行上執行Gradle或應用和配置建構掃描插件。

細粒度的傳遞依賴關系管理

Gradle 5.0提供了幾個新的特性來定制如何選擇依賴項,以及改進的POM和BOM支援:

  • 依賴限制允許您定義版本或版本範圍來限制直接和傳遞依賴版本(Maven不支援)。
  • 平台定義(又稱Maven BOM依賴項)是本地支援的,它允許在不使用外部插件的情況下導入Spring引導平台定義之類的東西。
  • 依賴項對齊允許邏輯組中的不同子產品(例如Jackson子產品)對齊到相同的版本。
  • 現在可以鎖定動态依賴項版本,以便更好地建構可重制性。

1.依賴限制

依賴限制提供了對傳遞依賴項的可靠控制。已聲明的限制列在改進的依賴關系洞察報告和建構掃描中。

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

複制

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

複制

此外,Gradle 5.0在使用Maven建構生成的依賴項時提供了更無縫的體驗。

  • 在使用POM檔案時,Gradle将正确地分離編譯和運作時範圍。這避免了由于以前在編譯類路徑中包含運作時依賴項而導緻的性能下降和依賴項洩漏。
  • 支援在POM檔案的

    标簽中定義版本範圍

<project>
  <modelVersion>4.0.0</modelVersion>
  <parent>
  <groupId>org.apache</groupId>
  <artifactId>apache</artifactId>
  <version>[3.0,4.0)</version>
  </parent>
  <groupId>org.apache.maven.its.mng2199</groupId>
  <artifactId>valid</artifactId>
  <version>1</version>
  <packaging>pom</packaging>
  </project>           

複制

3.依賴對齊

依賴項版本對齊允許屬于同一邏輯組(平台)的不同子產品在依賴項圖中擁有相同的版本。

這解決了確定所有Spring或Hibernate依賴項具有相同版本(如果适用)的問題。事實上,有許多庫是以集合的形式釋出的,集合中的每個庫具有相同的版本。這個特性還有其他用例,是以請按照上面的連結從文檔了解更多資訊。

4.依賴版本鎖定

您可以使用Gradle 5.0将動态或遠端依賴項鎖定到特定的版本,進而使依賴項解析更加确定和可重制。這可以防止轉換依賴項的更改意外地破壞建構。

Example 1,鎖定特定cofiguration

#build.gradle

configurations {
    compileClasspath {
        resolutionStrategy.activateDependencyLocking()
    }
}           

複制

Example 2,鎖定所有configuration

#build.gradle

dependencyLocking {
    lockAllConfigurations()
}           

複制

Example 3, 鎖定buildscript classpath configuration

#build.gradle

buildscript {
    configurations.classpath {
        resolutionStrategy.activateDependencyLocking()
    }
}           

複制

編寫Gradle建構邏輯

現在可以用Kotlin編寫Gradle建構腳本。此外,gradle init還擴充了項目類型和互動性。

1.Kotlin DSL支援

Kotlin DSL 1.0從Gradle 5.0開始就可以使用了。Kotlin中的靜态類型允許工具提供更好的IDE幫助,包括調試和重構建構腳本、自動完成、錯誤提示和您期望的其他一切。

2.擴充和互動式 gradle init

希望建立新Gradle建構的使用者可以選擇其他項目類型:kotlin-library和kotlin-application。此外,您可以選擇生成Groovy或Kotlin DSL建構腳本,并自定義項目名稱和包。最後,一個新的互動UI讓使用者體驗特别愉快。

3.更加可導航和面向用例的文檔

更高效的記憶體級别執行

--fail--fast

和JVM應用程式的指令行參數等特性允許更好的開發工作流,同時降低記憶體需求和緩存清理可以減少Gradle在系統上的開銷。

1.降低記憶體需求

更新不僅會使建構速度更快,而且還會大大減少記憶體的使用。許多緩存機制在Gradle 5.0中得到了優化,結果Gradle程序的預設最大記憶體大大減少。

Process Type Gradle 4.x Gradle 5.0
Command-line client 1 GB 64 MB
Gradle Daemon 1 GB 512 MB
Worker processes 1/4 of physical memory 512 MB

2.階段性緩存清理

手動清理Gradle緩存的日子已經結束了。Gradle現在定期清理過期緩存。Gradle還更精确地跟蹤陳舊的任務輸出,并且能判斷出如果目前不清理可能會造成錯誤,進而自動進行清理。

新的Gradle調用選項

1.Testing

Gradle 5.0包括對JUnit 5的支援:JUnit平台、JUnit Jupiter和JUnit Vintage。這種支援允許您啟用測試分組和篩選,并包括定制的測試引擎。

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

複制

2.Logging

在Gradle 5.0中,日志消息現在按照為非互動環境(如持續內建執行)生成日志消息的任務分組。

除了顯示正在執行哪些測試之外,Gradle豐富的指令行控制台還顯示了一個彩色的建構狀态,可以一眼看出是否有任何測試失敗。您還可以要求Gradle在任務使用“詳細”控制台模式執行時記錄它們。

最後,通過配置警告模式,可以彙總、屏蔽或擴充Gradle警告日志。這對于将您的建構更新到5.0級非常有幫助。

3.複合建構

複合建構允許您包含其他獨立項目,例如,您可以同時開發應用程式和依賴的庫。

現在可以使用建構掃描檢查複合建構。複合建構還與

--continuous

相容。

預設情況下它們是并行建構的,現在可以嵌套了。

4.JVM應用程式的指令行參數

使用Gradle 5.0運作帶有自定義參數的Java應用程式要容易得多,因為您可以在指令行上或通過IDE簡單地指定它們。

新的Gradle任務和插件api

Gradle 5.0提供了許多新的api,這些api支援更快、更通用的建構邏輯。

1.Performance APIs

新的Worker API允許安全的并行和異步執行。按照我們的指南,使用Worker API為自定義任務啟用更快的建構。

Gradle 5.0 新特性介紹
Gradle 5.0 新特性介紹

沒有使用 Worker API 使用 Worker API

2.Improved task I/O

正确聲明輸入和輸出對于正确的增量建構和建構緩存行為至關重要。Gradle 5.0加強了限制,并為輸入/輸出聲明引入了新的api,這些api可以幫助您避免正确性問題。

Gradle 5.0 新特性介紹

3.避免多餘配置

有些項目會産生很多很多的任務。當隻執行一些操作時,配置所有這些操作是沒有意義的。這就是Gradle 5.0的新配置避免api的幫助之處。通過在自定義任務中采用這些配置,大型項目可以節省高達10%的配置時間。

Gradle 5.0 新特性介紹

4.釋出 APIs

Gradle 5.0引入了新的api來改進對Maven和Ivy存儲庫的釋出:

  • 簽名插件支援對釋出的所有産物簽名。
  • 釋出了配置範圍内的依賴項排除。
  • Maven釋出和Ivy釋出插件提供類型安全的dsl來定制作為釋出的一部分生成的pom或Ivy子產品。

5.Task timeouts

現在可以為任務指定逾時時間,逾時後任務将被中斷。

task hangingTask() {
    doLast {
        Thread.sleep(100000)
    }
    timeout = Duration.ofMillis(500)
}           

複制

6.自定義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
    }
}           

複制

7.定制嵌套dsl

為需要使用内部api的任務提供自定義的嵌套DSL。Gradle 5.0為嵌套DSL元素提供了一流的api,在考慮使用者如何配置任務時提供了更大的靈活性。

Gradle 5.0為計算(或延遲)任務輸入和輸出提供了額外的API便利。這使得自定義任務作者能夠将Gradle models連接配接在一起,而不用擔心給定的屬性值何時會被知道,也不用擔心在任務配置期間會避免資源密集型工作。

如何更新

請參考如何從Gradle 4.x更新到 Gradle 5.0:

https://docs.gradle.org/5.0/userguide/upgrading_version_4.html

在更新之前,我們建議你:

  • 用Gradle Wrapper 更新到4.10.2

    gradle wrapper --gradle-version=4.10.2

  • 運作

    gradle help --scan

    列出所有不推薦使用的gradle api及其位置,包括插件
  • 更新你的Gradle插件,特别是那些在建構掃描的警告報告中列出的插件
  • 更新到JDK 8或更高版本