Gradle Tips#1-tasks

原文連接android

以這篇博客開始,我將寫一系列關於Gradle的文章,用來記錄接觸Gradle構建腳本以來我所理解的Gradle。gradle

今天要講的就是Gradle tasks以及task的配置和運行。可能有的讀者還不瞭解Gradle task,用真實的例子來展現應該更容易被理解。下面的代碼展現了三個Gradle task,稍後會講解這三者的不一樣。ui

task myTask {
   println "Hello, World!"
}
 
task myTask {
   doLast {
      println "Hello, World!"
   }
}
   
task myTask << {
    println "Hello, World!"
}

個人目的是建立一個task,當它執行的時候會打印出來」Hello, World!」。當我第一次建立task的時候,我猜想應該是這樣來寫的:
this

task myTask {
    println "Hello, World!"
}

如今,試着來執行這個myTask,在命令行輸入gradle myTask,打印以下:spa

user$ gradle myTask    
Hello, World!    
:myTask UP-TO-DATE

這個task看起來起做用了。它打印了」Hello, World!」。 
可是,它其實並無像咱們指望的那樣。下面咱們來看看爲何。在命令行輸入gradle tasks來查看全部可用的tasks。命令行

    user$ gradle tasks
    Hello, World!
    :tasks

    ------------------------------------------------------------    
    All tasks runnable from root project
    ------------------------------------------------------------
    
    Build Setup tasks
    -----------------    
    init - Initializes a new Gradle build. [incubating]
    ..........

等等,爲何」Hello, World!」打印出來了?我只是想看看有哪些可用的task,並無執行任何自定義的task! 
緣由其實很簡單,Gradle task在它的生命週期中有兩個主要的階段:配置階段 和 執行階段。 
可能個人用詞不是很精確,但這的確能幫助我理解tasks。code

Gradle在執行task以前都要對task先進行配置。那麼問題就來了,我怎麼知道個人task中,哪些代碼是在配置過程當中執行的,哪些代碼是在task執行的時候運行的?答就是,在task的最頂層的代碼就是配置代碼,好比:orm

    task myTask {
        def name = "Pavel" //<-- 這行代碼會在配置階段執行
        println "Hello, World!"////<-- 這行代碼也將在配置階段執行
    }

這就是爲何我執行gradle tasks的時候,會打印出來」Hello, World!」-由於配置代碼被執行了。但這並非我想要的效果,我想要」Hello, World!」僅僅在我顯式的調用myTask的時候纔打印出來。爲了達到這個效果,最簡單的方法就是就是使用Task#doLast()方法。生命週期

    task myTask {
        def text = 'Hello, World!' //configure my task
        doLast {
            println text //this is executed when my task is called
        }
    }

如今,」Hello, World!」僅僅會在我執行gradle myTask的時候打印出來。Cool,如今我已經知道如何配置以及使task作正確的事情。還有一個問題,最開始的例子中,第三個task的<<符號是什麼意思?ip

    task myTask2 << {
        println "Hello, World!" 
    }

這其實只是doLast的一個語法糖版本。它和下面的寫法效果是同樣的:

    task myTask {
        doLast {
            println 'Hello, World!' //this is executed when my task is called
        }
    }

可是,這種寫法全部的代碼都在執行部分,沒有配置部分的代碼,所以比較適合那些簡小不須要配置的task。一旦你的task須要配置,那麼仍是要使用doLast的版本。

相關文章
相關標籤/搜索