欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Gradle 創(chuàng)建Task的多種方法

 更新時(shí)間:2021年11月01日 10:50:19   作者:無(wú)知者云  
本文主要介紹了Gradle 創(chuàng)建Task的多種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

 在本系列的上篇文章中,我們講到了Gradle入門,在本篇文章中我們將講到創(chuàng)建Task的多種方法。

  Gradle的Project從本質(zhì)上說(shuō)只是含有多個(gè)Task的容器,一個(gè)Task與Ant的Target相似,表示一個(gè)邏輯上的執(zhí)行單元。我們可以通過(guò)很多種方式定義Task,所有的Task都存放在Project的TaskContainer中。

(1)調(diào)用Project的task()方法創(chuàng)建Task

  在使用Gradle時(shí),創(chuàng)建Task最常見(jiàn)的方式便是:

task hello1 << {
   println 'hello1'
}

  這里的“<<”表示追加的意思,即向hello中加入執(zhí)行過(guò)程。我們還可以使用doLast來(lái)達(dá)到同樣的效果:

task hello2 {
   doLast {
      println 'hello2'}
}

  另外,如果需要向Task的最前面加入執(zhí)行過(guò)程,我們可以使用doFirst:

task hello3 {
   doFirst {
      println 'hello3'}
}

  在上面的3個(gè)例子中,Gradle的DSL向我們展示了一種非常自然的風(fēng)格來(lái)創(chuàng)建Task,而事實(shí)上這些都只是一種內(nèi)部DSL,也即必須符合groovy的語(yǔ)法要求。上面的task關(guān)鍵字實(shí)際上是一個(gè)方法調(diào)用,該方法屬于Project。Project中存在多個(gè)重載的task()方法。和Ruby等動(dòng)態(tài)語(yǔ)言一樣,在調(diào)用groovy方法時(shí),我們不用將參數(shù)放在括號(hào)里面。

  以上我們自定義的3個(gè)Task都位于TaskContainer中,Project中的tasks屬性即表示該TaskContainer。為此,我們可以新建一個(gè)Task來(lái)顯示這些信息:

task showTasks {
   println tasks.class
   println tasks.size()
}

  將以上4個(gè)Task放在同一個(gè)build.gradle中,再執(zhí)行g(shù)radle showTasks,命令行輸出如下:

...
class org.gradle.api.internal.tasks.DefaultTaskContainer_Decorated
4
... 

  上面的DefaultTaskContainer_Decorated表示tasks類型,而4表示該TaskContainer中包含有4個(gè)自定義的Task——包括showTasks本身。 

(2)通過(guò)TaskContainer的create()方法創(chuàng)建Task

  在上文中我們講到,通過(guò)task()方法創(chuàng)建的Task都被存放在了TaskContainer中,而Project又維護(hù)了一個(gè)TaskContainer類型的屬性tasks,那么我們完全可以直接向TaskContainer里面添加Task。查查TaskContainer的API文檔可以發(fā)現(xiàn),TaskContainer向我們提供了大量重載的create()方法用于添加Task。

tasks.create(name: 'hello4') << {
   println 'hello4'
}

(3)聲明Task之間的依賴關(guān)系

  Task之間是可以存在依賴關(guān)系,比如TaskA依賴TaskB,那么在執(zhí)行TaskA時(shí),Gradle會(huì)先執(zhí)行TaskB,再執(zhí)行TaskA。我們可以在定義一個(gè)Task的同時(shí)聲明它的依賴關(guān)系:

task hello5(dependsOn:hello4) << {
    println 'hello5'
}

  當(dāng)然,我們也可以在定義Task之后再聲明依賴:

task hello6 << {
   println 'hello6'
}

hello6.dependsOn hello5

(4)配置Task

  一個(gè)Task除了執(zhí)行操作之外,還可以包含多個(gè)Property,其中有Gradle為每個(gè)Task默認(rèn)定義的Property,比如description,logger等。另外,每一個(gè)特定的Task類型還可以含有特定的Property,比如Copy的from和to等。當(dāng)然,我們還可以動(dòng)態(tài)地向Task中加入額外的Property。在執(zhí)行一個(gè)Task之前,我們通常都需要先設(shè)定Property的值,Gradle提供了多種方法設(shè)置Task的Property值。

  首先,我們可以在定義Task的時(shí)候?qū)roperty進(jìn)行配置:

task hello7 << {
   description = "this is hello7" 
   println description
}

  我們還可以通過(guò)閉包的方式來(lái)配置一個(gè)已有的Task:

task hello8 << {
println description
}

hello8 {
description = "this is hello8"
}

  需要注意的是,對(duì)hello8的description設(shè)置發(fā)生在創(chuàng)建該Task之后,在執(zhí)行“gradle hello8”時(shí),命令行依然可以打印出正確的“this is hello8”,這是因?yàn)镚radle在執(zhí)行Task時(shí)分為兩個(gè)階段,首先是配置階段,然后才是實(shí)際執(zhí)行階段。所以在執(zhí)行hello8之前,Gradle會(huì)掃描整個(gè)build.gradle文檔,將hello8的description設(shè)置為“this is hello8”,然后執(zhí)行hello8,此時(shí)hello8的description已經(jīng)包含了設(shè)置后的值。

  我們還可以通過(guò)調(diào)用Task的configure()方法完成Property的設(shè)置:

task hello9 << {
   println description
}

hello9.configure {
   description = "this is hello9"
}

  實(shí)際上,通過(guò)閉包的方式配置Task在內(nèi)部也是通過(guò)調(diào)用Task的configure()方法完成的,對(duì)此我們將在后續(xù)的文章中詳細(xì)地講到。

請(qǐng)通過(guò)以下方式下載本系列文章的Github示例代碼:

git clone https://github.com/davenkin/gradle-learning.git

到此這篇關(guān)于Gradle 創(chuàng)建Task的多種方法的文章就介紹到這了,更多相關(guān)Gradle 創(chuàng)建Task內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解elasticsearch實(shí)現(xiàn)基于拼音搜索

    詳解elasticsearch實(shí)現(xiàn)基于拼音搜索

    這篇文章主要為大家介紹了詳解elasticsearch實(shí)現(xiàn)基于拼音搜索示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • 詳解堆排序算法原理及Java版的代碼實(shí)現(xiàn)

    詳解堆排序算法原理及Java版的代碼實(shí)現(xiàn)

    如果將堆理解為二叉樹(shù),那么樹(shù)中任一非葉結(jié)點(diǎn)的關(guān)鍵字均不大于(或不小于)其左右孩子(若存在)結(jié)點(diǎn)的關(guān)鍵字,堆排序的時(shí)間復(fù)雜度為O(N*logN),這里我們就來(lái)詳解堆排序算法原理及Java版的代碼實(shí)現(xiàn)
    2016-06-06
  • Maven的生命周期與自定義插件實(shí)現(xiàn)方法

    Maven的生命周期與自定義插件實(shí)現(xiàn)方法

    Maven的生命周期就是對(duì)所有的構(gòu)建過(guò)程進(jìn)行抽象和統(tǒng)一。包含了項(xiàng)目的清理、初始化、編譯、測(cè)試、打包、集成測(cè)試、驗(yàn)證、部署和站點(diǎn)生成等幾乎所有的構(gòu)建步驟
    2022-12-12
  • 多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn)

    多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn)

    這篇文章主要介紹了多數(shù)據(jù)源@DS和@Transactional實(shí)戰(zhàn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 簡(jiǎn)單了解Spring IoC相關(guān)概念原理

    簡(jiǎn)單了解Spring IoC相關(guān)概念原理

    這篇文章主要介紹了簡(jiǎn)單了解Spring IoC相關(guān)概念原理,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)-連接數(shù)據(jù)庫(kù)并把得分寫入數(shù)據(jù)庫(kù)

    Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)-連接數(shù)據(jù)庫(kù)并把得分寫入數(shù)據(jù)庫(kù)

    這篇文章給大家分享了Java實(shí)現(xiàn)飛機(jī)大戰(zhàn)中連接數(shù)據(jù)庫(kù)并把得分寫入數(shù)據(jù)庫(kù)的相關(guān)知識(shí)點(diǎn)和代碼,有興趣的可以學(xué)習(xí)參考下。
    2018-07-07
  • idea 實(shí)現(xiàn)git rebase操作應(yīng)用場(chǎng)景

    idea 實(shí)現(xiàn)git rebase操作應(yīng)用場(chǎng)景

    本文結(jié)合idea工具進(jìn)行rebase的各種場(chǎng)景的操作,借助工具更能直觀地觀察到分支之間地操作差異,方便我們理解rebase的各種操作以及場(chǎng)景的使用,對(duì)idea  git rebase操作知識(shí)感興趣的朋友一起看看吧
    2024-01-01
  • 基于Java中最常用的集合類框架之HashMap(詳解)

    基于Java中最常用的集合類框架之HashMap(詳解)

    下面小編就為大家?guī)?lái)一篇基于Java中最常用的集合類框架之HashMap(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • java中的類型自動(dòng)轉(zhuǎn)換機(jī)制解析

    java中的類型自動(dòng)轉(zhuǎn)換機(jī)制解析

    這篇文章主要介紹了java中的類型自動(dòng)轉(zhuǎn)換機(jī)制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • 對(duì)Mapper 中幾種update的區(qū)別說(shuō)明

    對(duì)Mapper 中幾種update的區(qū)別說(shuō)明

    這篇文章主要介紹了對(duì)Mapper 中幾種update的區(qū)別說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-11-11

最新評(píng)論