在歷經了一年多時間, 20 個 4.x 系列版本的迭代後,Gradle 官方終於在 11月26日 發佈了 5.0 的正式版本,先放上一張官方各版本 Gradle 性能對比圖html
官方表示這是至今爲止最快、最安全,最強大的版本。java
讓咱們趕忙來看一下有哪些使人激動的新特性。git
我擦,感受一臉懵逼,不要緊,下面我會針對這些特性作些簡要的總結和說明,內容可能比較多,可是乾貨滿滿,建議耐心閱讀下去。github
早在 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 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.5jackson-databind
版本 2.8.9 -> 2.9.5jackson-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 init
方法進行了升級,經過更多的特性和交互,來幫助咱們去快速初始化一個 Gradle 項目。簡單來講的話,就是增強版的腳手架。
當你在控制檯執行 init
task 後,Gradle 將會提供更多的構建信息提示,來幫助你生成 Gradle 模版項目。
init
task 能夠經過 kotlin-library
或者 kotlin-application
類型來設置生成一個 Kotlin 的類庫或者應用。你只須要根據它的提示來操做便可。
init
task 生成的構建腳本將推薦使用新的 implementation
、testImplementation
、testRuntimeOnly
去代替 compile
、testCompile
、testRuntime
。
--project-name
選項能夠幫助你調整生成的項目名稱--package
選項能夠幫助你調整生成的項目包名init
task 會建立一個空的 resource 目錄
init
task 會生成一個簡單的 .gitignore
文件來幫助你設置你的 Git repository 。
Gradle 的文檔搜索功能回來了(雖然我一直不知道這個功能在哪裏),總之,能夠更加方便的搜索用戶手冊和 DSL 的描述。
固然,還有更方便查找類和方法的 Gradle API Javadocs。
這個超時設置簡直太有用了有木有。特別是當你由於一些網絡緣由,致使你的 build task
一直卡在那裏的時候,你的內心必定是萬馬奔騰的感受,趕忙用起來吧,不要再浪費這些無用的時間了。示例:
task hangingTask() {
doLast {
Thread.sleep(100000)
}
timeout = Duration.ofMillis(500)
}
複製代碼
HTTP 訪問重試功能,嗯。挺好
經過 --priority low
命令參數或者 org.gradle.priority=low
屬性設置可讓你的 Gradle 以一個低優先級的進程啓動,至於好處嘛,固然是你一邊在 building
的時候,一邊聽音樂的時候,不再會感受一卡一卡的了 :)
簡單看了下介紹,能夠幫助你查看代碼覆蓋率的 JaCoCo 插件,感興趣的同窗能夠點這裏瞭解更多
Gradle 5.0 版本構建支持 Java 11 版本
這個版本爲插件和自定義 task 提供了建立 SourceDirectorySet
的 API、提升 Provider
的 API、和構建緩存的兼容性提升。
Gradle Native project 持續的改善和提高 native 生態系統, 更多細節:Changes included in Gradle 5.0
一些現有功能的提高,詳細點擊這裏
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 版本如今仍是預覽版,因此建議想升級的小夥伴,再耐心等待一段時間。