原文首發於微信公衆號:躬行之(jzman-blog)
前面兩篇文章分別介紹了 Gradle 基礎知識以及 Groovy 相關基礎知識,這也是學習 Gradle 所必需瞭解的,文章連接以下::java
本文將對 Gradle 總體進行了介紹和學習,瞭解了 Task、Project 等相關概念以及對使用 Gradle 來構建項目的一些經常使用操做,主要內容以下:微信
說一下 Gradle 構建項目的 Setting 文件,該文件主要用來配置當前工程,好比 Android 開發中一個項目中可能有多個子 Module,當不須要某個子 Module 時,能夠取消該 Module 在配置文件 Setting 中的配置便可,固然只有在 Setting 文件中配置的子 Module 纔會被構建,固然不僅是 Android 開發,只要使用 Gradle 構建的項目都同樣,Setting 是 Gradle 構建項目默認的配置文件名,下面簡單測試一下 Setting.gradle 文件的使用,測試工程目錄以下:閉包
├─GradleSetting │ ├─.gradle │ │ ├─4.1 │ │ │ ├─fileChanges │ │ │ ├─fileHashes │ │ │ └─taskHistory │ │ └─buildOutputCleanup │ └─test │ └─Method │ └─.gradle │ ├─4.1 │ │ ├─fileChanges │ │ ├─fileHashes │ │ └─taskHistory │ └─buildOutputCleanup │ build.gradle │ setting.gradle
在工程名爲 GradleSetting 的工程中 test 文件夾下有一個 Method 的子項目,這裏會經過配置 setting.gradle 文件將子項目 Method 構建到 GradleSetting 中,setting.gradle 文件內容以下:app
println "---------test----Setting.gradle----------" //輸出當前工程目錄 println(rootDir) //指定要參與構建的子項目 include ':Method' project(':Method').projectDir = new File(rootDir,'test/Method')
來看一下輸出結果:post
PS E:\Gradle\study\GradleSetting> gradle testGradleSetting ---------test----Setting.gradle---------- E:\Gradle\study\GradleSetting > Configure project : testGradleSetting > Configure project :Method 3 3 30 獲取方法返回的結果:30 1 2 3 4 5 BUILD SUCCESSFUL in 2s
由於在 setting.gradle 文件中配置了 Method,從輸出結果看 Method 確實參與了構建,取消在 setting.gradle 文件中的配置,則不會構建 Method,最好本身驗證一下。學習
上面配置了子項目 Method 所在的位置,若是不指定則默認是與 setting.gradle 同級的目錄。測試
若是選擇使用 Gradle 構建項目,則每一個項目都有一個 build.gradle 文件,該文件是項目構建的入口,對整個項目的配置生效,能夠在根項目配置子項目的一下通用配置,好比配置子項目的倉庫爲 jcenter,這樣子項目中全部的依賴就指向 jcenter 中心庫下載,下面是參考代碼:gradle
//配置子項目依賴的倉庫 subprojects{ repositories{ jcenter() } } //配置所有項目 allprojects{ } ...
經過本小節主要了解 build.gradle 文件的做用便可,實際開發中針對不一樣類型的項目會有更詳細的相應配置策略。ui
在 Gradle 中有不少 Project,可將某個 Project 打包成 jar 提供給另外一個 Project 使用,每一個 Project 都是根據其業務需求抽象出來的一個子模塊,最終經過 Gradle 構建成完整的項目。spa
每一個 Project 容許有多個 task,Task 理解爲任務,task 主要 完成某個具體的功能點,好比 wrapper task 主要就是完成 wrapper 文件的建立。
對於任務的建立已經比較熟悉了,下面使用 task 聲明一個任務:
//1. 建立一個任務 task createTask{ doFirst{ println 'doFirst' } doLast{ println 'doLast' } } //2. 使用TaskContainer建立一個任務,Project已經定義的TaskContainer,即tasks tasks.create("createTask1"){ doFirst{ println 'doFirst' } doLast{ println 'doLast' } }
task 能夠理解爲建立任務的關鍵字,實際上 task 是 Project 裏面的一個方法,在 Groovy 中能夠省略方法參數上的括號,花括號裏的內容是一個閉包,主要是對 task 進行相關配置,doFirst 和 doLast 是 Task 中經常使用的兩個方法,分別會在該 task 開始和結束時執行。
任務之間能夠相互依賴,能夠控制某個任務執行的前後順序,好比在運行 A 以前必須先運行 B,此時任務 A 依賴任務 B,具體參考以下代碼:
//單任務依賴:經過dependsOn指定要依賴的任務 task B(dependsOn: A){ doFirst{ println 'B' } } task C{ doFirst{ println 'C' } } //多任務依賴 task D{ dependsOn A, C doFirst{ println 'D' } }
下面看一下執行多依賴任務 gradle D 的執行結果:
PS E:\Gradle\study\GradleSetting> gradle D > Task :A A > Task :C C > Task :D D BUILD SUCCESSFUL in 2s
顯然,執行任務 D,其依賴的其餘兩個任務先執行,控制了任務執行的前後順序。
注意:腳本是按照順序執行,若是任務任務 A 和 C 在任務 D 的後面定義,當執行任務 D 的時候確定會出錯。
建立的任務都有本身的名稱,其類型是 Task,那麼咱們就能夠經過 Task API 來控制控制任務的執行,使用任務名操做任務的原理是:Project 在建立任務的時候,已經將該任務對應的任務聲明爲 Project 對象的一個類型爲 Task 的一個屬性,測試代碼以下:
//任務之間的交互 task E{ println 'hello e' println "E是否是Project的屬性:"+project.hasProperty('E') } E.doFirst{ println 'doFirst' } E.doLast{ println 'doLast' }
上述代碼的執行結果以下:
PS E:\Gradle\study\GradleSetting> gradle E > Configure project : hello e E是否是Project的屬性:true > Task :E doFirst doLast BUILD SUCCESSFUL in 1s
Project 和 Task 都容許用戶添加額外的自定義屬性,經過應用所屬對應的 ext 屬性來實現,添加以後能夠經過 ext 屬性對自定義的屬性進行讀取和設置,若是要同時添加多個自定義屬性,能夠經過 ext 代碼塊,參考以下代碼定義自定義屬性:
apply plugin:"java" //自定義單個屬性 ext.name1 = "Gradle" //自定義多個屬性 ext{ age = 10 score = 100 } //在SourceSet中使用自定義屬性 sourceSets.all{ ext.resourceDir = null } //配置自定義屬性 sourceSets{ main{ resourceDir = "main/res" } test{ resourceDir = "test/res" } } task customProperty{ println "name=${name1}" println "age=${age}" println "score=${score}" sourceSets.each { println "${it.name} resourceDir is ${it.resourceDir}" } }
上述代碼的執行結果:
PS E:\Gradle\study\GradleSetting> gradle customProperty > Configure project : name=Gradle age=10 score=100 main resourceDir is main/res test resourceDir is test/res BUILD SUCCESSFUL in 2s
自定義屬性相較局部變量做用域更加普遍,能夠跨 Task、Project 訪問自定義屬性,只要能訪問這些屬性所屬的對象,那麼這些屬性就能夠被訪問到, Android 開發中可使用自定義屬性單獨定義版本號、版本名稱以及用到的第三方庫的版本,將其贊成在單獨的 gradle 文件中,各 Module 直接獲取便可,不只方便管理依賴庫的版本,還在必定程度上提升工做效率。
Gradle 腳本基於 Grooy ,而 Groovy 徹底兼容 Java 語法,Gradle 腳本本質上仍是代碼,在 Gradle 中能夠利用相關語法來完成相關功能。能夠關注公衆號:零點小築(jzman-blog),一塊兒交流學習。