自己動手開發一個Android持續整合工具-關於Task

sunbird89629發表於2019-01-22

note:

  1. 這是一個持續完善的文件,若您有什麼問題,意見或者建議,請給我留言,我會進行修正。
  2. 在這個系列,不會一開始就介紹Groovy相關的一些概念,而是跟著專案走,遇到什麼概念就介紹什麼概念。
  1. 簡介
  2. 準備工作
  3. 關於Task

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複製程式碼

通過上面的日誌我們可以得到以下資訊:

  1. Task "publishRelease" 的方法體和 Task "publishDebug" 的方法體最先執行,我們可以理解為Task的方法體是在配置階段執行的。
  2. 然後myTest的任務的"doFirst"執行了,我們明明呼叫的是Task "publishRelease"任務,為什麼 Task "myTest"執行了?這是因為"dependsOn: "myTest""這程式碼起了作用。我們可以這樣理解:當前執行的Task"publishRelease"是依賴Task "myTest"的,所有要先執行Task "myTest",然後Task "publishRelease"才能執行。
  3. 然後是Task "publishRelease" 的 "doFirst" 和 "doLast"。通過語義我們可以清楚,"doFirst"先執行,然後"doLast"執行。

相關文章