Gradle 5.0 正式版本發佈,一大波新特性來襲

前言

在歷經了一年多時間, 20 個 4.x 系列版本的迭代後,Gradle 官方終於在 11月26日 發佈了 5.0 的正式版本,先放上一張官方各版本 Gradle 性能對比圖html

官方表示這是至今爲止最快、最安全,最強大的版本。java

  • 改進的增量編譯
  • 更快的構建速度
  • 細粒度的傳遞依賴管理
  • 更高效的內存執行等等。
  • ......

讓咱們趕忙來看一下有哪些使人激動的新特性。git

官方新特性一覽

  • Kotlin DSL 1.0
  • Dependency version alignment
  • Gradle build initialization features
  • Searchable documentation
  • Task timeouts
  • HTTP retries during dependency resolution
  • Java 11 runtime support
  • Plugin authoring features
  • Gradle Native features
  • Promoted features

我擦,感受一臉懵逼,不要緊,下面我會針對這些特性作些簡要的總結和說明,內容可能比較多,可是乾貨滿滿,建議耐心閱讀下去。github

Kotlin DSL 1.0

早在 Gradle 4.x 版本中就已經支持了經過使用 Koltin DSL 的方式去編寫構建腳本,可是當時剛出來,不少地方支持的還不太好(須要踩坑),因此並不推薦你們遷移過去,而是嚐鮮爲主。如今 Kotlin DSL 1.0 release 版本出來後,意味着接下來你能夠放心的遷移或者使用 Kotlin DSL 啦。新版本作了不少優化和改進的地方,好比:spring

  • Code Completion:代碼自動完成緩存

  • Error Highlighting:錯誤高亮安全

  • Quick Documentation:文檔快速提示網絡

  • Refactoring:代碼重構app

    圖片來自官方

如何遷移你的構建語言到 Kotlin DSL 上,能夠參考個人另外一篇文章Gradle指南之從Groovy遷移到Kotlin dom

Dependency version alignment

Dependency version alignment allows different modules belonging to the same logical group (a platform) to have identical versions in a dependency graph.

根據官網的介紹,直譯過來的意思是:依賴版本一致性容許屬於相同的邏輯組(平臺)的不一樣module 擁有相同的版本依賴圖。

這個概念確實很差理解,我本身也是花了一些時間去理解和消化。仍是經過一個示例來講明吧。若是有英文水平高或者理解能力比較強的同窗,歡迎指教。

好比,咱們 build.gradle 有如下依賴:

dependencies {
	    // a dependency on Jackson Databind
	    implementation 'com.fasterxml.jackson.core:jackson-databind:2.8.9'

	    // and a dependency on vert.x
	    implementation 'io.vertx:vertx-core:3.5.3'
	}
複製代碼

由於 vertx-core 也間接依賴了 jackson-core,經過依賴傳遞,當解析依賴信息的時候,咱們實際依賴的版本號是:

  • jackson-core 版本 2.9.5(依賴傳遞)
  • jackson-databind 版本 2.8.9 -> 2.9.5(低版本經過依賴仲裁變爲高版本)
  • jackson-annotation 版本 2.9.0 (jackson-databind 2.8.9 版本間接依賴 jackson-annotation 2.9.0 版本,注意這裏,由於上面的依賴仲裁,變成了被高版本 的 jackson-databind 2.9.5 所依賴)

這裏建議有興趣的同窗實際在 intellij IDEA CE 裏建個簡單的 Gradle 工程,根據上面說的步驟實際操做一遍就很容易理解了。

再舉個小例子,看下下面的依賴關係:

+--- com.google:gson:1.0.0 -> 2.0.0
	|    \--- com.google:gson-test:1.0.0
	+--- commons-io:commons-io:2.0.0
	  \--- com.google:gson:2.0.0
複製代碼

gson 被仲裁到 2.0.0 高版本,而 gson-test 仍是 1.0.0 版本,至關於原來是 gson:1.0.0 依賴的是的 gson-test:1.0.0 ,如今變成了高版本的 gson:2.0.0 依賴了低版本的 gson-test:1.0.0,這樣就頗有可能會出現一些未知問題。理想的依賴應該是 gson:2.0.0 依賴的 gson-test:2.0.0。

經過以上的分析,咱們發現實際上解析出來的依賴庫版本出現了和預期不一致的狀況,而相似這種狀況很容易會致使一些未知問題,尤爲是在一些不兼容老版本接口的依賴庫裏就會直接致使 Crash。

一般,針對這種問題,以前的作法可能就是簡單粗暴的強指定版本號,不過,如今有了更加優雅的方式去幫助咱們去管理版本,即 Dependency version alignment,咱們能夠經過指定一個 platform 去管理某一組的 module

回到剛纔的場景示例中,咱們在 build.gradle 裏能夠定義 jackson 爲一組的 module 版本的規則,以下所示:

class JacksonAlignmentRule implements ComponentMetadataRule {
	    void execute(ComponentMetadataContext ctx) {
	        ctx.details.with {
	            if (id.group.startsWith("com.fasterxml.jackson")) {
	                // declare that Jackson modules all belong to the Jackson virtual platform
	                belongsTo("com.fasterxml.jackson:jackson-platform:${id.version}")
	            }
	        }
	    }
	}
複製代碼

而後應用該規則:

dependencies {
	    components.all(JacksonAlignmentRule)
	}
複製代碼

最後,在執行完 ./gradlew app:dependencies 命令後,你會發現當匹配上 com.fasterxml.jackson 組的 module 的版本都保持了一致,也就是

  • jackson-core 版本 2.9.5
  • jackson-databind 版本 2.8.9 -> 2.9.5
  • jackson-annotation 版本 2.9.0 -> 2.9.5

另外,platform 一樣也提供了強制爲一組 module 指定某個版本號,好比:

dependencies {
	    // Forcefully downgrade the Jackson platform to 2.8.9
	    implementation enforcedPlatform('com.fasterxml.jackson:jackson-platform:2.8.9')
	}
複製代碼

還有一個比較方便的地方,就是經過 platform,咱們能夠直接省略該 module 的版本號(今後告別經過定義版本變量去維護衆多 module 的版本信息),以下所示:

dependencies {
	    // import a BOM. The versions used in this file will override any other version found in the graph
	    implementation(enforcedPlatform("org.springframework.boot:spring-boot-dependencies:1.5.8.RELEASE"))

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

	     // this version will be overriden by the one found in the BOM
	    implementation("org.codehaus.groovy:groovy:1.8.6")
	}
複製代碼

Gradle build initialization features

新版本對 gradle init 方法進行了升級,經過更多的特性和交互,來幫助咱們去快速初始化一個 Gradle 項目。簡單來講的話,就是增強版的腳手架。

Interactive mode

當你在控制檯執行 init task 後,Gradle 將會提供更多的構建信息提示,來幫助你生成 Gradle 模版項目。

Kotlin library and applications

init task 能夠經過 kotlin-library 或者 kotlin-application 類型來設置生成一個 Kotlin 的類庫或者應用。你只須要根據它的提示來操做便可。

Generated builds use recommended configurations

init task 生成的構建腳本將推薦使用新的 implementationtestImplementationtestRuntimeOnly 去代替 compiletestCompiletestRuntime

Configure project and source package names

  • --project-name 選項能夠幫助你調整生成的項目名稱
  • --package 選項能夠幫助你調整生成的項目包名

Create resource directories

init task 會建立一個空的 resource 目錄

Create a .gitignore file

init task 會生成一個簡單的 .gitignore 文件來幫助你設置你的 Git repository 。

Searchable documentation

Gradle 的文檔搜索功能回來了(雖然我一直不知道這個功能在哪裏),總之,能夠更加方便的搜索用戶手冊和 DSL 的描述。

固然,還有更方便查找類和方法的 Gradle API Javadocs

Task timeouts

這個超時設置簡直太有用了有木有。特別是當你由於一些網絡緣由,致使你的 build task 一直卡在那裏的時候,你的內心必定是萬馬奔騰的感受,趕忙用起來吧,不要再浪費這些無用的時間了。示例:

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

HTTP retries during dependency resolution

HTTP 訪問重試功能,嗯。挺好

Performance features

Gradle can be started as a low-priority process

經過 --priority low 命令參數或者 org.gradle.priority=low 屬性設置可讓你的 Gradle 以一個低優先級的進程啓動,至於好處嘛,固然是你一邊在 building 的時候,一邊聽音樂的時候,不再會感受一卡一卡的了 :)

JaCoCo plugin now works with the build cache and parallel test execution

簡單看了下介紹,能夠幫助你查看代碼覆蓋率的 JaCoCo 插件,感興趣的同窗能夠點這裏瞭解更多

Java 11 runtime support

Gradle 5.0 版本構建支持 Java 11 版本

Plugin authoring features

這個版本爲插件和自定義 task 提供了建立 SourceDirectorySet 的 API、提升 Provider 的 API、和構建緩存的兼容性提升。

Gradle Native features

Gradle Native project 持續的改善和提高 native 生態系統, 更多細節:Changes included in Gradle 5.0

Promoted features

一些現有功能的提高,詳細點擊這裏

其餘

5.0 版本共計修復了 166 個 issues(驚人),固然,伴隨而來的還有一些已知的 issues ,詳細能夠點擊這裏 5.0 release-notes

總結

Gradle 5.0 版本真的是乾貨滿滿,尤爲是對於使用 Gradle 構建的 Android 或者 Java 開發者來講,像 Kotlin DSL(構建語言)、Dependency version alignment(依賴版本一致性)、Performance features(性能提高) 等等這些特性仍是很讓人期待的。有興趣的小夥伴能夠趕忙更新一波了。

如何升級到 Gradle 5.0 版本呢,很簡單,如下兩種方式任選其一

  • 執行 ./gradlew wrapper --gradle-version=5.0 命令

  • 或者直接修改你的 rootProject/gradle/wrapper/gradle-wrapper.properties

    distributionBase=GRADLE_USER_HOME
      distributionPath=wrapper/dists
      distributionUrl=https\://services.gradle.org/distributions/gradle-5.0-all.zip
      zipStoreBase=GRADLE_USER_HOME
      zipStorePath=wrapper/dists
    複製代碼
  • 附上官方升級說明: Upgrade Gradle 4.x to 5.0
  • 須要注意的是:目前 Android 的項目若是要升級到 5.0 版本的 Gradle ,須要配套的升級 Android Gradle Plugin 和 Android Studio 到 3.4 版本,因爲 5.0 Gradle 版本剛出來,Android Studio 3.4 版本如今仍是預覽版,因此建議想升級的小夥伴,再耐心等待一段時間。
相關文章
相關標籤/搜索