Gradle構建腳本基礎掃盲

本文意在快速瞭解Gradle構建腳本基礎,後續會補充練習Demo方便讀者本身動手驗證文章中的內容以加深記憶.閉包

Settings文件

在Android項目的根目錄中有一個settings.gradle文件,由名字能夠看出,它是一個設置文件,用於初始化及工程樹的配置.
設置文件大多數的做用都是爲了配置子工程.(Gradle根工程和子工程的概念與Android項目的Project和Module同樣,根工程至關於Project,而子工程至關於Module),一個子工程只有在settings.gradle文件中配置了才能被Gradle識別並在構建的時候包含進去.app

rootProject.name='GradleDemo' //根工程名
include ':app', ':common' //配置子工程
project(':common').projectDir = new File('librarys/common') //指定路徑
複製代碼

如上面這段代碼中所展現同樣,定義了一個子項目common並指定了相應的目錄.(若是不指定,默認目錄是其同級目錄,好比 incluede ':common',若是不指定,Gradle就會把當前同級的common目錄做爲common工程的目錄,但若是此時同級下沒有common目錄,就會報錯),利用這個特性,只要在settings.gradle文件中指定好路徑,咱們就能夠將咱們的工程放到任意目錄下,能夠靈活的對工程進行分級、分類.函數

Build文件

每個Project都有會有一個Build文件,是該Project構建的入口,在這裏能夠對Project進行配置,如版本、插件、依賴等.
既然每一個Project都有Build文件,那麼也就會有RootProject和ChildProject的區別.
RootProject位於根工程下,ChildProject位於子工程下,且RootProject能夠獲取到全部的ChildProject,因此此時能夠對全部的ChildProject進行統一配置,好比應用的插件、依賴的Maven中心庫等.測試

//配置全部childProject
subprojects {
    repositories {
        jcenter()
    }
}
//配置全部Project包含RootProject
allprojects {
    repositories {
        jcenter()
    }
}
複製代碼

Task和Project

Task

Task翻譯成中文就是任務,它是一個原子性的操做.好比編譯一次代碼,複製一份文件等都是一個Task.gradle

Projects

Project其實就是一個在咱們開發過程當中對業務場景進行拆分解耦而成的一個個獨立的模塊,最後由這一個個的Project組成了整個Gradle構建.每一個Project中都會包含多個Task,也能夠說Project是由多個Task組成的.ui

Task的建立

方式一:
task customTask{
    doFirst{
        println 'customTask1:doFirst'
    }

    doLast{
        println 'customTask1:doLast'
    }
}

方式二:
tasks.create('customTask'){
    doFirst {
        println 'customTask1:doFirst'
    }

    doLast {
        println 'customTask1:doLast'
    }
}
執行「gradle -q customTask」打印結果爲:
>>>  
customTask1:doFirst
customTask1:doLast
複製代碼

這裏的task看起來像是一個關鍵字,但其實他是Project對象的一個函數,原型是create(String name,Closure configureClosure),第一個參數name是Task的名字也就是customTask,第二個參數是一個閉包,也就是咱們花括號中的代碼塊,根據閉包的規則,最後一個參數是閉包時,能夠放到括號外面,而後方法的括號能夠省略,就變成咱們上面的寫法了.該閉包的做用就是用來對咱們建立的任務進行配置.spa

Task依賴

Task之間是能夠有依賴關係的,那麼什麼是依賴關係呢,其實就是ATask要等BTask執行後才能執行,經過Task間的依賴能夠控制Task執行的前後順序,好比在Android中,install Task是依賴於package Task進行打包生成apk後才能安裝到設備裏.
示例: 把大象裝冰箱總共分幾步插件

task buyAFridgeAndAnElephant{
    println '買一臺冰箱和一頭大象'
}

task openTheRefrigeratorDoor(dependsOn: buyAFridgeAndAnElephant) {
    println '把冰箱門打開'
}

task putTheElephantInTheFridge() {
    println '把大象放進冰箱'
}

task closeTheRefrigeratorDoor {
    dependsOn openTheRefrigeratorDoor, putTheElephantInTheFridge
    println '把冰箱門關上'
}

執行「gradle -q closeTheRefrigeratorDoor」打印結果爲:
>>>  
買一臺冰箱和一頭大象
把冰箱門打開
把大象放進冰箱
把冰箱門關上
複製代碼

由示例代碼咱們能夠看見,經過dependsOn能夠指定其依賴的Task,openTheRefrigeratorDoor依賴於buyAFridgeAndAnElephant,因此執行openTheRefrigeratorDoor的時候buyAFridgeAndAnElephant會被優先執行來做爲啓動openTheRefrigeratorDoor的條件,保證了執行的順序.同時,一個Task能夠同時依賴多個Task,但Task之間不能相互依賴.翻譯

Task間的交互

建立一個任務和咱們定義一個變量是同樣的,變量名就是咱們定義的任務名,類型是Task.因此咱們能夠經過任務的名字,使用Task的API訪問它的方法、屬性或者對Task從新配置等.
若是要使用任務名對任務進行操做,必須先定義聲明,由於腳本是順序執行的.
示例:code

task eat{
    println '吃飯'
}

eat.doLast{
    println '刷碗'
}

執行「gradle -q eat」打印結果爲:
>>>  
吃飯
刷碗
複製代碼

如上示例,調用了doLast方法,在任務執行後作一些額外的操做.
對於直接經過任務名操做任務的原理是:**Project在建立該任務的時候,同時把該任務對應的任務名註冊爲Project的一個類型爲Task的屬性.咱們能夠測試一下.

task eat{
    println '吃飯'
}

eat.doLast{
    println project.hasProperty('eat')
    println '刷碗'
}
執行「gradle -q eat」打印結果爲:
>>>  
吃飯
true
刷碗
複製代碼

打印結果中project.hasProperty('eat)輸出結果爲true,說明每個任務都是Project的屬性.

自定義屬性

Project和Task都容許用戶添加額外的自定義屬性,要添加額外的屬性,經過應用所屬對應的ext屬性便可實現.添加以後能夠經過ext屬性對自定義屬性讀取和設置,若是要同時添加多個自定義屬性,能夠經過ext代碼塊.

ext.email = 'hippox.rd@gmail.com'

ext{
    name = '墨非白'
    location = '北京'
}

task customProperty{
    println email
    println name
    println location
}

打印結果爲:
hippox.rd@gmail.com
customProperty
北京
複製代碼

這些自定義屬性能夠跨Projet、Task訪問,只要能訪問到這些屬性所屬的對象,那麼這些屬性就均可以被訪問. 自定義屬性不單單侷限於Project和Task,還能夠應用在SourceSet中,這樣等於每種SourceSet又多了一個可供配置的屬性.

未完待續,下一篇文章會對Task進行詳細介紹.

相關文章
相關標籤/搜索