Android Gradle 學習筆記(五):Gradle 任務 Task

在以前的學習中,咱們瞭解到Gradle的構建工做都是由Task組合完成的。本節咱們就來介紹一下 Task - 任務。網絡

1、多種方式建立任務

在Gradle中,咱們能夠有不少種方式來建立任務。爲何有這麼多種方式呢?這都依賴於Project提供的快捷方法以及TaskContainer提供的相關Create方法。因此咱們閱讀一些Gradle腳本的時候,見到一些不熟悉的建立任務的方法也不要奇怪,通常分爲如下幾種方式:閉包

  • 第一種:直接以一個任務名字建立任務。
  • 第二種:以一個任務名字+一個對該任務配置的Map對象來建立任務。
  • 第三種:任務名字+閉包配置。
  • 第四種:任務名字+Map參數+閉包。
  • 第五種:使用TaskContainer建立任務,調研tasks.create方法建立任務。

2、多種方式訪問任務

其實咱們在以前的學習的例子中,咱們已經經過了一些方式訪問了任務。下面咱們整理一下相關的方式:app

  • 第一種:咱們建立的任務都會做爲項目(Project)的一個屬性,屬性名就是任務名,因此咱們能夠經過該任務名稱訪問和操做該任務。
  • 第二種:任務都是經過TaskContainer建立的,TaskContainer就是咱們建立任務的集合,在Project中咱們能夠經過tasks屬性訪問TaskContainer,因此咱們能夠以訪問集合元素的方式訪問咱們的任務。
  • 第三種:經過路徑訪問。方式有兩種:get & find,區別在於get的時候找不到就會拋出UnknownTaskException異常,而find在找不到任務的時候會返回null。
  • 第四種:經過名稱訪問。經過名字的訪問也有兩種:get & find,它們的區別和上面第三種介紹的同樣。

值得強調的是,經過路徑訪問的時候,參數能夠是任務路徑也能夠是任務的名字。可是經過名字訪問的時候,參數值只能是任務的名字,不能爲路徑。工具

3、任務排序

其實並無真正的任務排序功能,這個排序不像咱們想象的經過設置優先級或者Order順序實現,而是經過任務的shouldRunAfter和mustRunAfter這兩個方法,它們能夠控制一個任務應該或者必定在某個任務以後執行。經過這種方式,你能夠在某些狀況下控制任務的執行順序,而不是經過強依賴的方式。單元測試

這個功能是很是有用的,好比咱們設置的順序是,必須先執行單元測試,而後才能進行打包,這就保證了App的質量。相似的狀況還有不少,好比必需要單元測試以後,才能進行集成測試,打包成功以後才能進行部署發佈等。學習

舉例說明:測試

  • taskB.shouleRunAfter(taskA):表示taskB應該在taskA執行以後執行,這裏的應該而不是必須。因此有可能任務順序並不會按預設的執行。
  • taskB.mustRunAfter(taskA):表示taskB必須在taskA執行以後執行,這個規則相對更加嚴格。

4、任務的onlyIf斷言

斷言就是一個條件表達式。Task有一個onlyIf方法,它接受一個閉包做爲參數,若是該閉包返回true,則該任務執行,不然就跳過。這有不少用途,好比控制程序哪些狀況下打什麼包,何時進行單元測試,什麼狀況下執行單元測試的時候不執行網絡測試。ui

下面咱們以一個打首發包的例子來講明:spa

final String BUILD_APPS_ALL="all";
final String BUILD_APPS_SHOUFA="shoufa";
final String BUILD_APPS_EXCLUDE_SHOUFA="exclude_shoufa";

task ex48QQRelease << {
    println "打應用寶的包"
}
task ex48BaiduRelease << {
    println "打百度的包"
}
task ex48HuaweiRelease << {
    println "打華爲的包"
}

task ex48MiuiRelease << {
    println "打Miui的包"
}

task build {
    group BasePlugin.BUILD_GROUP
    description "打渠道包"
}

build.dependsOn ex48QQRelease,ex48BaiduRelease,ex48HuaweiRelease,ex48MiuiRelease

ex48QQRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_SHOUFA.equals(buildApps)
            || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

ex48BaiduRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_SHOUFA.equals(buildApps)
                || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

ex48HuaweiRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
                || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

ex48MiuiRelease.onlyIf {
    def execute = false;
    if(project.hasProperty("build_apps")){
        Object buildApps = project.property("build_apps")
        if(BUILD_APPS_EXCLUDE_SHOUFA.equals(buildApps)
                || BUILD_APPS_ALL.equals(buildApps)){
            execute = true
        }else{
            execute = false
        }
    }else{
        execute = true
    }
    execute
}

在例子中,咱們定義了4個渠道,其中百度和應用寶是首發包,另外兩個華爲和MiUi不是首發包,經過build_apps屬性來控制咱們要打哪些渠道包。經過這種方式,咱們在進行一些相關流程控制上會更加靈活。這在咱們使用JenKins等CI工具進行自動化打包和部署的時候就能很好的體現出來。code

相關文章
相關標籤/搜索