學習Groovy和Gradle中的思考

2021-08-11 22:24:10 字數 1751 閱讀 9230

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...