在以前的學習中,咱們瞭解到Gradle的構建工做都是由Task組合完成的。本節咱們就來介紹一下 Task - 任務。網絡
在Gradle中,咱們能夠有不少種方式來建立任務。爲何有這麼多種方式呢?這都依賴於Project提供的快捷方法以及TaskContainer提供的相關Create方法。因此咱們閱讀一些Gradle腳本的時候,見到一些不熟悉的建立任務的方法也不要奇怪,通常分爲如下幾種方式:閉包
其實咱們在以前的學習的例子中,咱們已經經過了一些方式訪問了任務。下面咱們整理一下相關的方式:app
值得強調的是,經過路徑訪問的時候,參數能夠是任務路徑也能夠是任務的名字。可是經過名字訪問的時候,參數值只能是任務的名字,不能爲路徑。工具
其實並無真正的任務排序功能,這個排序不像咱們想象的經過設置優先級或者Order順序實現,而是經過任務的shouldRunAfter和mustRunAfter這兩個方法,它們能夠控制一個任務應該或者必定在某個任務以後執行。經過這種方式,你能夠在某些狀況下控制任務的執行順序,而不是經過強依賴的方式。單元測試
這個功能是很是有用的,好比咱們設置的順序是,必須先執行單元測試,而後才能進行打包,這就保證了App的質量。相似的狀況還有不少,好比必需要單元測試以後,才能進行集成測試,打包成功以後才能進行部署發佈等。學習
舉例說明:測試
斷言就是一個條件表達式。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