從task{doLast{}}看gradle build的三個階段

Gradle是JVM生態下又一款開源的自動化構建工具,以基於Groovy的DSL描述構建過程,在結合了ant和maven的優點的基礎上,提供了更爲簡潔,靈活和高效的build體驗【1】。

Task代表了構建過程中的一個簡單原子工作單元,類似於一個系統中的子函數。定義Task的目的是將一個大的構建過程劃分爲粒度較小,高內聚,低耦合,可重用的功能單位,提高構建腳本的開發效率,可讀性以及可維護性。例如,java plugin提供的編譯或者生成javadoc用的task。

在實際的項目中,會遇到“兩類”task:

task myTask1 { 
  println ‘mytask’
}
task myTask2 () {    doLast{        println 'during run'    }}

通過兩個實驗,可以看出他們的區別:
首先,定義兩個task

task simpleTask(){    println 'during simpleTask'}
task doLastTask() {    doLast{        println 'during doLastTask'    }}

實驗一

./gradlew doLastTask
during simpleTask
:doLastTask
during doLastTask

實驗二

./gradlew simpleTask 
during simple task
:simpleTask 

可以看到,運行simpleTask的時候,doLastTask沒有運行;反過來,運行doLastTask的時候,simpleTask卻運行了。
通過查看文檔,我們可以知道,這是由gradle構建的運行機制決定的。gradle 構建的生命週期主要分爲三個階段,Initialization,Configuration,Execution。

  • Initialization:Gradle支持單個或多個工程的構建。在Initialization階段,Gradle決定哪些工程將參與到當前構建過程,併爲每一個這樣的工程創建一個Project實例。一般情況下,參與構建的工程信息將在settings.gradle中定義。
  • Configuration:在這一階段,配置project的實例。所有工程的構建腳本都將被執行。Task,configuration和許多其他的對象將被創建和配置。
  • Execution:在之前的configuration階段,task的一個子集被創建並配置。這些子集來自於作爲參數傳入gradle命令的task名字,在execution階段,這一子集將被依次執行。

所以這裏並沒有“兩類”task,只是task的不同部分的step在build的不同階段執行。即doLast內的部分在execution階段執行(如果task名作爲參數傳入的話),doLast外的部分在configuration階段執行,看第二組實驗:

println 'This is done in configuration phase'task mytask1(){    println 'This is also done in configuration phase by mytask1'}task mytask2() {    doLast{        println 'This is done in execution phase by mytask2'    }    println 'This is also done in configuration phase by mytask2'}println 'This is done in configuration phase as well'

實驗一

./gradlew 
This is done in configuration phase
This is also done in configuration phase by mytask1
This is also done in configuration phase by mytask2
This is done in configuration phase as well

實驗二

./gradlew mytask2
This is done in configuration phase
This is also done in configuration phase by mytask1
This is also done in configuration phase by mytask2
This is done in configuration phase as well
:mytask2
This is done in execution phase by mytask2

可以看到,doLast之外的內容,無論如何都會執行,而且是在configuration階段執行。而doLast內的內容只會在task名作爲參數傳入的時候纔會執行,而且是在execute階段執行。

【1】從make到gradle,淺談自動化構建工具

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章