以這篇部落格開始,我將寫一系列關於Gradle的文章,用來記錄接觸Gradle構建指令碼以來我所理解的Gradle。
今天要講的就是Gradle tasks以及task的配置和執行。可能有的讀者還不瞭解Gradle task,用真實的例子來展示應該更容易被理解。下面的程式碼展示了三個Gradle task,稍後會講解這三者的不同。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
task myTask { println "Hello, World!" } task myTask { doLast { println "Hello, World!" } } task myTask << { println "Hello, World!" } |
我的目的是建立一個task,當它執行的時候會列印出來”Hello, World!”。當我第一次建立task的時候,我猜測應該是這樣來寫的:
1 2 3 |
task myTask { println "Hello, World!" } |
現在,試著來執行這個myTask,在命令列輸入gradle myTask,列印如下:
1 2 3 |
user$ gradle myTask Hello, World! :myTask UP-TO-DATE |
這個task看起來起作用了。它列印了”Hello, World!”。
但是,它其實並沒有像我們期望的那樣。下面我們來看看為什麼。在命令列輸入gradle tasks來檢視所有可用的tasks。
1 2 3 4 5 6 7 8 9 10 11 12 |
user$ gradle tasks Hello, World! :tasks ------------------------------------------------------------ All tasks runnable from root project ------------------------------------------------------------ Build Setup tasks ----------------- init - Initializes a new Gradle build. [incubating] .......... |
等等,為什麼”Hello, World!”列印出來了?我只是想看看有哪些可用的task,並沒有執行任何自定義的task!
原因其實很簡單,Gradle task在它的生命週期中有兩個主要的階段:配置階段 和 執行階段。
可能我的用詞不是很精確,但這的確能幫助我理解tasks。
Gradle在執行task之前都要對task先進行配置。那麼問題就來了,我怎麼知道我的task中,哪些程式碼是在配置過程中執行的,哪些程式碼是在task執行的時候執行的?答案就是,在task的最頂層的程式碼就是配置程式碼,比如:
1 2 3 4 |
task myTask { def name = "Pavel" //<-- 這行程式碼會在配置階段執行 println "Hello, World!"////<-- 這行程式碼也將在配置階段執行 } |
這就是為什麼我執行gradle tasks的時候,會列印出來”Hello, World!”-因為配置程式碼被執行了。但這並不是我想要的效果,我想要”Hello, World!”僅僅在我顯式的呼叫myTask的時候才列印出來。為了達到這個效果,最簡單的方法就是就是使用Task#doLast()方法。
1 2 3 4 5 6 |
task myTask { def text = 'Hello, World!' //configure my task doLast { println text //this is executed when my task is called } } |
現在,”Hello, World!”僅僅會在我執行gradle myTask的時候列印出來。Cool,現在我已經知道如何配置以及使task做正確的事情。還有一個問題,最開始的例子中,第三個task的<<符號是什麼意思?
1 2 3 |
task myTask2 << { println "Hello, World!" } |
這其實只是doLast的一個語法糖版本。它和下面的寫法效果是一樣的:
1 2 3 4 5 |
task myTask { doLast { println 'Hello, World!' //this is executed when my task is called } } |
但是,這種寫法所有的程式碼都在執行部分,沒有配置部分的程式碼,因此比較適合那些簡小不需要配置的task。一旦你的task需要配置,那麼還是要使用doLast的版本。
Happy Gradling