第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

編寫(xiě) Gradle 任務(wù)Task

前面幾節(jié)課我們先介紹了 Gradle,然后學(xué)習(xí)了 Groovy 的基礎(chǔ)語(yǔ)法,緊接著介紹了 Android 項(xiàng)目中 Gradle 的配置。我們從配置中可以看出 Gradle 的構(gòu)建都是基于任務(wù)(Task) 的,有了前面幾節(jié)的基礎(chǔ),今天這節(jié)課我們來(lái)學(xué)習(xí)一下,怎么樣去定義一個(gè) Gradle 的任務(wù)(Task) ,以及Task的生命周期。

1. 聲明 Task

關(guān)于 Task 的聲明,我們其實(shí)在第三節(jié)《構(gòu)建自己的 Gradle 工程》這一節(jié)里面就有所介紹,我們創(chuàng)建 Gradle 項(xiàng)目時(shí)就聲明了一個(gè) Task 為 hello,下面我們聲明一個(gè)名字為 mTask 的 Task。

task mTask{
     doLast{
       println "Hello,這是我聲明的Task"
     }
}

我們?cè)诳刂婆_(tái)執(zhí)行命令gradle mTask,我們會(huì)看到輸出結(jié)果。

$ gradle mTask
Starting a Gradle Daemon (subsequent builds will be faster)

> Task :mTask
Hello,這是我聲明的Task

BUILD SUCCESSFUL in 13s
1 actionable task: 1 executed

一般情況下,我們這樣聲明 Task,其實(shí)創(chuàng)建的都是org.gradle.api.DefaultTask的對(duì)象,它是org.gradle.api.Task的一個(gè)實(shí)現(xiàn)。DefaultTask的所有屬性都是私有的,只能通過(guò) get 和 set 方法獲取。

Tips: 其實(shí) Task 的聲明除了上面方法外還有下面 2 種方法:

//Task的第二種聲明方法
task (mTask){
     doLast{
       println "Hello,這是我聲明的Task"
     }
}
//Task的第三種聲明方法
task ('mTask'){
     doLast{
       println "Hello,這是我聲明的Task"
     }
}

2. 給 Task 添加 Action

我們創(chuàng)建一個(gè) Task 后可以根據(jù)我們的需要給 Task 添加不同的 Action,上面的“doLast”就是給隊(duì)列尾增加一個(gè)Action。下面我們先來(lái)了解以下,關(guān)于 Task 添加 Action 的一些 API

 //在Action 隊(duì)列頭部添加Action
 Task doFirst(Action<? super Task> action);
 Task doFirst(Closure action);

 //在Action 隊(duì)列尾部添加Action
 Task doLast(Action<? super Task> action);
 Task doLast(Closure action);
    
 //已經(jīng)過(guò)時(shí)了,建議用 doLast 代替
 Task leftShift(Closure action);

 //刪除所有的Action
 Task deleteAllActions();

關(guān)于上面的 API,deleteAll 就是刪除所有的 Action,這個(gè)我們不用太多講解,而 leftShiftdoLast 其實(shí)是一樣的就是在隊(duì)列的尾部增加一個(gè) Action。這個(gè) leftShift API 已經(jīng)過(guò)時(shí),我們建議使用 doLast 代替。關(guān)于 doFirstdoLast 我們下面通過(guò)一個(gè)例子來(lái)講解:

//創(chuàng)建一個(gè)名字為apiTask的 task 
task apiTask {

    //創(chuàng)建一個(gè) Action , 添加到 Action 列表的頭部
   doFirst(new Action<Task>() {
       @Override
       void execute(Task task) {
           println "action1++++++++++"
       }
   })

    //創(chuàng)建一個(gè) Action , 添加到 Action 列表的頭部
    doFirst {
        println "action2++++++++++"
    }

	//創(chuàng)建一個(gè) Action , 添加到 Action 列表的尾部
    doLast(new Action<Task>() {
       @Override
       void execute(Task task) {
           println "action3++++++++++"
       }
   })
    	//創(chuàng)建一個(gè) Action , 添加到 Action 列表的尾部
	doLast {
        println "action4++++++++++"
    }
}

我們?cè)谏厦娴睦拥?Task 隊(duì)列中,先添加了 action1,然后再在頭部添加了 action2,現(xiàn)在隊(duì)列從頭到尾應(yīng)該是"action2=>action1"然后再在隊(duì)尾增加 action3,action4,最終隊(duì)列里面從頭至尾依次為:“action2 => action1 => action3 => action4”。我們下面執(zhí)行 apiTask 任務(wù)看看是不是輸出這個(gè)順序。

圖片描述

3. 定義 Task 的依賴

關(guān)于 Task,它也是可以進(jìn)行依賴的,Task 聲明依賴的關(guān)鍵字是dependsOn,它支持聲明一個(gè)或多個(gè)依賴,下面我們看個(gè)例子:

task first {
	doLast {
        println "+++++first+++++"
    }
}
task second {
	doLast {
        println "+++++second+++++"
    }
}

//指定多個(gè)task依賴
task print(dependsOn :[second,first]) {
	doLast {
      logger.quiet "指定多個(gè)task依賴"
    }
}

task third(dependsOn : print) {
	doLast {
      println '+++++third+++++'
    }
}

// //還可以采用這樣的方式
// task third {
// 	doLast {
//         println "+++++third+++++"
//     }
// }
// third.dependsOn('print')

我們分別執(zhí)行gradle printgradle third命令:

圖片描述

圖片描述
我們從上面的執(zhí)行結(jié)果中可以看出,執(zhí)行 Task 之前,會(huì)先執(zhí)行它的依賴 Task。

4. Task 的執(zhí)行順序

我們通過(guò)前面dependsOn關(guān)鍵字的定義知道,如果一個(gè) Task 定義了依賴,那么執(zhí)行這個(gè) Task 之前,它的依賴 Task 需要先執(zhí)行。這也就是 Gradle 的一個(gè)比較優(yōu)秀思想:聲明在一個(gè)給定的 Task 執(zhí)行之前什么 Task 該被執(zhí)行,而沒(méi)有定義如何去執(zhí)行。 在 Gradle 中 Task 的執(zhí)行順序是由輸入/輸出規(guī)范自動(dòng)確定的。既然這么做,肯定是有優(yōu)點(diǎn)的,那么我們看下它的優(yōu)點(diǎn):

優(yōu)點(diǎn):

  1. 由于沒(méi)有明確規(guī)定,如何去執(zhí)行,而是規(guī)定什么先去執(zhí)行,這就是支持 Task 并行。這樣可以極大的節(jié)約構(gòu)建的時(shí)間成本。
  2. 我們只需要關(guān)注依賴任務(wù),不用去關(guān)注依賴鏈上的關(guān)系是否發(fā)生變化。

5. Gradle 構(gòu)建的生命周期

前面我們說(shuō)了 Task 的執(zhí)行順序,下面我們了解以下 Gradle 構(gòu)建的生命周期。我們學(xué)習(xí) Android 時(shí)候我們知道,一個(gè)應(yīng)用(Application)、活動(dòng)(Activity)、服務(wù)(Service)都是有生命周期。同樣今天我們學(xué)習(xí)的 Gradle 的構(gòu)建它也是有生命周期的。Gradle 構(gòu)建的生命周期有三個(gè)階段:初始階段,配置階段運(yùn)行階段。

5.1 初始階段

在這個(gè)階段,Gradle 項(xiàng)目根據(jù)正在執(zhí)行的項(xiàng)目,找出哪些項(xiàng)目依賴需要參與到構(gòu)建中。在 Android 項(xiàng)目中就是根據(jù)setting.gradleinclude信息,查看有模塊項(xiàng)目參與到構(gòu)建中。

Tips: 在這個(gè)構(gòu)建階段當(dāng)前已有的構(gòu)建腳本代碼都不會(huì)被執(zhí)行。

5.2 配置階段

在這個(gè)階段,Gradle 創(chuàng)建了一個(gè)模型來(lái)代表任務(wù),并參與到項(xiàng)目構(gòu)建中來(lái)。Android 項(xiàng)目中這個(gè)階段就是執(zhí)行build.gradle 腳本文件。

5.3 運(yùn)行階段

這個(gè)階段,就是根據(jù) Gradle 命令傳遞過(guò)來(lái)的 Task 的名稱(chēng),執(zhí)行相關(guān)的依賴任務(wù)。Task 的 Action 會(huì)在這個(gè)階段執(zhí)行。

下面分享一個(gè)小技巧。

Tips: 自定義 Task 的名字最好采用駝峰命名法

我們以我們上面的 apiTask 來(lái)定義:

//創(chuàng)建一個(gè)名字為apiTask的 task 
task apiTask {

    //創(chuàng)建一個(gè) Action , 添加到 Action 列表的頭部
   doFirst(new Action<Task>() {
       @Override
       void execute(Task task) {
           println "action1++++++++++"
       }
   })

    //創(chuàng)建一個(gè) Action , 添加到 Action 列表的頭部
    doFirst {
        println "action2++++++++++"
    }

	//創(chuàng)建一個(gè) Action , 添加到 Action 列表的尾部
    doLast(new Action<Task>() {
       @Override
       void execute(Task task) {
           println "action3++++++++++"
       }
   })
    	//創(chuàng)建一個(gè) Action , 添加到 Action 列表的尾部
	doLast {
        println "action4++++++++++"
    }
}

前面我們執(zhí)行命令是:gradle apiTask,我們使用來(lái)駝峰命名法還可以使用gradle aT來(lái)執(zhí)行。

圖片描述

這個(gè)我們其實(shí)日常開(kāi)發(fā)中也遇到過(guò),我們打包時(shí)執(zhí)行的gradle aR 相當(dāng)于gradlew assembleRelease。

6. 小結(jié)

這篇文章我們從 Task 的聲明開(kāi)始,介紹了如何聲明 Task,再到給 Task 添加 Action,逐步深入,再介紹了 Task 的依賴,執(zhí)行順序,以及 Gradle 構(gòu)建的生命周期。通過(guò)這一篇文章,大家應(yīng)該對(duì) Task 有了一定的認(rèn)識(shí)和理解。這將為我們后面組件化和插件化打下基礎(chǔ)。