創建Task的多種方法


Gradle的Project從本質上說只是含有多個Task的容器,一個Task與Ant的Target相似,表示一個邏輯上的執行單元。

我們可以通過多種方式定義Task,所有的Task都存放在Project的TaskContainer中。

 

(1)調用Project的task()方法創建Task

在使用Gradle時,創建Task最常見的方式便是:

task hello1 << {
    println 'hello1'
}

這里的“<<”表示追加的意思,即向hello1中計入執行過程。我們還可以使用doLast來達到同樣的效果:

task hello2 {
    doLast {
        println 'hello2'
    }
}

另外,如果需要向Task的最前面加入執行過程,我們可以使用doFirst

task hello3 {
    doFirst {
        println 'hello3'
    }
}

上面的 Gradle 的 DSL 實際上是一種內部的 DSL 。task關鍵字實際上是一個方法調用,該方法屬於Project。Project存在多個重載的 task()方法。在調用 groovy 方法時,我們可以不用將參數放在括號內。

 

上面三個自定義的Task都位於TaskContainer中,Project中的tasks屬性表示該TaskContainer。

我們可以新建一個Task來顯示這些信息:

task showTasks {

    println tasks.class

    println tasks.size()

}

在第一章中的 build.gradle 中加入 showTasks,再執行 gradle showTasks ,命令行輸出如下:

上面的 DefaultTaskContainer_Decorated 表示 tasks 類型。而5表示自定義的 task,包括 showTasks 本身。

 

(2)通過 TaskContainer 的 create() 方法創建 Task。

TaskContainer 提供了大量重載的 create() 方法用於添加 Task。

task.create(name: 'hello4') << {
    println 'hello4'
}

 

(3)聲明Task之間的依賴關系

Task之間是可以存在依賴關系,比如TaskA依賴TaskB,那么在執行TaskA時,Gradle會先執行TaskB,在執行TaskA,我們可以在定義一個Task的同時聲明它的依賴關系:

task hello5(dependsOn: hello4)<< {
    println 'hello5'    
}

當然,我們也可以在定義Task之后再聲明依賴:

task hello6 << {
   println 'hello6'
}

hello6.dependsOn hello5

(4)配置Task

一個Task除了執行操作之外,還包含了多個Property。其中Gradle為每個Task默認定義的Property。比如description,logger等。

另外每一個特定的Task還可以含有特定的Property,比如Copy的from和to等。

也可以動態地向Task中加入額外的Property。在執行一個Task前,我們通常都需要先設定Property的值,Gradle提供了多種方法設置Task的Property的值。

首先,我們可以在定義Task的時候對Property進行配置:

task hello7 << {
    description = "this is hello7"
    println description
}

我們還可以通過閉包的方式來配置一個已有的Task:

task hello8 << {
    println description
}

hello8 {
    description = "this is hello8"
}

實際上對於hello8的description發生在創建該Task后,執行gradle hello8時,依然能夠正確的打印出 this is hello8 。這是因為 gradle 在執行 Task 時分為兩個階段:配置階段、執行階段。執行 hello8 前,會先掃描整個build.gradle文檔,然后設置屬性,再執行 hello8。

 

還可以通過configure()完成Property的設置:

task hello9 << {
    println description
}

hello9.configure {
    description = "this is hello9"
}

實際上,通過閉包的方法配置Task在內部也是通過調用Task的configuration方法完成的,對此將在后面講。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM