note:
- 這是一個持續完善的文件,若您有什麼問題,意見或者建議,請給我留言,我會進行修正。
- 在這個系列,不會一開始就介紹Groovy相關的一些概念,而是跟著專案走,遇到什麼概念就介紹什麼概念。
Gradle是一種宣告式的構建工具。在執行時,Gradle並不會一開始便順序執行build.gradle檔案中的內容,而是分為兩個階段,第一個階段是配置階段,然後才是實際的執行階段。在配置階段,Gradle將讀取所有build.gradle檔案的所有內容來配置Project和Task等,比如設定Project和Task的Property,處理Task之間的依賴關係等。
Task是Gradle中很重要的一個概念,接下來我們就在上一篇文章的基礎上來詳細的瞭解下Task。話不多說,我們先來看下一個Task執行流程。
我們先在"app"模組下新建一個任務test,然後修改"publishRelease",如下:
task myTest(){
group "publish"
doFirst{
println("this is myTest task doFirst.")
}
}
task publishRelease(dependsOn: "myTest") {
group "publish"
println("this is publishRelease task body.")
doFirst {
println("this is publishRelease task doFirst.")
}
doLast {
println("this is publishRelease task doLast.")
}
}
task publishDebug() {
group "publish"
println("this is publishDebug task body.")
}複製程式碼
然後執行 publishRelease,看下輸出輸出結果如下:
我們分析下上圖的執行結果:
1 Executing tasks: [publishRelease]
2
3 Parallel execution with configuration on demand is an incubating feature.
4 this is publishRelease task body.
5 this is publishDebug task body.
6 :app:myTest
7 this is myTest task doFirst.
8 :app:publishRelease
9 this is publishRelease task doFirst.
10 this is publishRelease task doLast.
11
12 BUILD SUCCESSFUL in 0s
14 actionable tasks: 2 executed複製程式碼
通過上面的日誌我們可以得到以下資訊:
- Task "publishRelease" 的方法體和 Task "publishDebug" 的方法體最先執行,我們可以理解為Task的方法體是在配置階段執行的。
- 然後myTest的任務的"doFirst"執行了,我們明明呼叫的是Task "publishRelease"任務,為什麼 Task "myTest"執行了?這是因為"dependsOn: "myTest""這程式碼起了作用。我們可以這樣理解:當前執行的Task"publishRelease"是依賴Task "myTest"的,所有要先執行Task "myTest",然後Task "publishRelease"才能執行。
- 然後是Task "publishRelease" 的 "doFirst" 和 "doLast"。通過語義我們可以清楚,"doFirst"先執行,然後"doLast"執行。