gradle執行時,會首先根據task閉包構建任務,構建過程形象化描述如下:
task test
dolast
println
'hello.'
//1}
當使用者執行test任務時,執行以下步驟:
1. 執行build.gradle,初始化任務,初始化步驟為2-7;
2. 註冊test任務,任務體都是預設好的,不可更改,為列印冒號加任務名,所以test的任務體為println ':test'
;
3. 每個任務都有乙個佇列乙個棧,乙個是依賴佇列,乙個是first棧,乙個是last佇列;
4. 遇到dofirst函式,該函式接受乙個閉包作為引數,dofirst函式會把閉包引數放入first棧;
5. 遇到dolast函式,同理dofirst函式,閉包引數會被放入last佇列;
6. 然後遇到println 'hello.'
,執行該指令//1;
7. 至此初始化過程完成。
8. 開始執行test任務前,先檢查是否任務依賴,如果有,先把依賴的任務都執行完。
9. 然後開始執行test任務;
10. 執行時,首先執行test任務的任務體,即println ':test'
;
11. 然後執行test任務的first棧//2和last佇列//3;
12. 任務執行結束。
所以,實際上我們發現,我們並不能直接往test任務體中的新增或修改指令。所以,常見的做法是:
task test <<
或者:task test
}
我們用dolast函式把要執行的指令x放入last佇列中;
如果想要在任務x前,執行一些操作,可以寫在dofirst函式裡;也可以寫在dolast函式裡,但是這個dolast函式要寫在含有指令x的dolast的函式前面;
如果想要在任務後,執行一些操作,可以寫在dolast函式裡,但是這個函式需要寫在含有指令x的dolast的函式後面。
因為first是棧,last是佇列,所以當有多個dofirst和dolast函式時,它們的執行順序是相反的,後定義的dofirst先執行,先定義的dolast先執行。如下:
task test
dofirst
dolast
dofirst
dolast
println
'hello1.'
dolast }/*
執行結果為:
hello1.
:test
first2.
first3.
first4.
last5.
last6.
last7.
*/
任務test1和test2的寫法雖然相似,含義卻極其不同。test2的寫法不過是test3的語法糖。
test1中的指令會在任務的初始化階段執行;而test2中的指令在初始化階段只會被放到last佇列中,不會被執行,當執行test2的任務時,才會附帶執行。
另外需要注意的是,當執行test2時,test1中的指令也會被執行。因為執行test2之前需要先進行初始化,初始化時同一檔案中所有的task都會被初始化。
task test1
task test2 <<
task test3
}
Gradle基礎知識 Groovy的閉包
上面 定義乙個名為 closure name 的閉包,用途由 closure body 中的 定義。匿名閉包指不宣告閉包變數名,只有閉包方法體 def closure with no param 執行closure with no param 或者closure with no param.call...
Gradle自動化構建 三 Groovy 閉包
閉包與字串 string str 2 3 5,abc println str.each println str.find def list str.findall println list.toliststring 2,3,5 println str.any true any 只要符合條件就返回tr...
Gradle 學習之路
gradle 的官網 在 mac 下gradle 的配置 gradle home usr local bin gradle 2.7 export gradle home export path path gradle home bin 然後再在console上輸入以下命令 source bash p...