Gradle學(xué)習(xí)8——依賴管理

學(xué)習(xí)本系列前可以下載相關(guān)的github項(xiàng)目gradleLearnDemo
地址:https://github.com/sososeen09/gradleLearnDemo

依賴管理是Gradle非常棒的一個(gè)功能浅妆,很多情況下,你只需要在構(gòu)建文件中添加一行代碼曼玩,Gradle就會(huì)從遠(yuǎn)程倉(cāng)庫(kù)中下載依賴毡代,在項(xiàng)目中就可以使用依賴中的類。如果你所依賴的這個(gè)庫(kù)本身也有它自己的依賴罗洗,Gradle會(huì)處理并解決這些問(wèn)題肛跌,這些依賴中的依賴廊驼,被稱作傳遞性依賴。

Gradle使用 dependencies 這個(gè)DSL來(lái)定義構(gòu)建所依賴的類庫(kù)惋砂,使用repositories 來(lái)告訴構(gòu)建從哪里獲取依賴妒挎,當(dāng)你配置好后,Gradle會(huì)自動(dòng)下載依賴西饵,并存儲(chǔ)在本地緩存中酝掩,在構(gòu)建中使用它們,一個(gè)特定版本的依賴只會(huì)在你的機(jī)器上下載一次眷柔。
例如:

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.jsoup:jsoup:1.9.2'
}

Gradle支持三種不同的依賴倉(cāng)庫(kù):Maven期虾、Ivy和靜態(tài)文件或文件夾原朝。一個(gè)依賴通常由三種元素定義的,可以稱呼它們?yōu)橐蕾噷傩浴?/p>

  • group:通常標(biāo)識(shí)一個(gè)組織镶苞、公司或者項(xiàng)目喳坠。如org.jsoup
  • name:一個(gè)工件的名稱唯一的描述了依賴。如::jsoup
  • version:一個(gè)類庫(kù)的版本號(hào)茂蚓。如1.9.2

上面的dependencies壕鹉,也可以使用map形式包含group、name聋涨、version屬性晾浴。例如:

dependencies {
    compile group:'org.jsoup', name:'jsoup', version:'1.9.2'
}

對(duì)于依賴來(lái)說(shuō),唯一需要的字段是name牍白。group和version都是可選的元素脊凰。盡管如此,為了表述清楚茂腥,建議添加group狸涌,而version可確保依賴庫(kù)不會(huì)自動(dòng)更新。

1 使用和配置倉(cāng)庫(kù)

為了方便最岗,Gradle預(yù)定義了三個(gè)Maven倉(cāng)庫(kù):

  • Jcenter
  • Maven Central
  • 本地Maven倉(cāng)庫(kù)

Gradle使用Maven Central倉(cāng)庫(kù)就是調(diào)用mavenCentral()方法帕胆,其它兩個(gè)倉(cāng)庫(kù)的使用也類似。為了在構(gòu)建腳本中包含它們仑性,你需要這么做:

repositories {
    jcenter()
    mavenCentral()
    mavenLocal()
}

Maven Central 和JCenter是兩個(gè)有名的遠(yuǎn)程倉(cāng)庫(kù),一般不同時(shí)使用它們右蹦,通常推薦使用JCenter诊杆,它是Maven Central的超集,其也是Android Studio創(chuàng)建Android項(xiàng)目時(shí)的默認(rèn)依賴倉(cāng)庫(kù)何陆,而且JCenter還支持HTTPS晨汹。

本地Maven倉(cāng)庫(kù)是你已經(jīng)使用了的所有依賴的本地緩存,你也可以自己添加依賴贷盲。默認(rèn)情況下淘这,依賴倉(cāng)庫(kù)可以在一個(gè)名為.m2目錄文件夾的主目錄中找到。在Linux或Mac OS X上巩剖,該路徑是~/.m2铝穷,在Windows上路徑是%UserProfile%/.m2。
除了這些預(yù)定義的依賴倉(cāng)庫(kù)佳魔,你也可以添加其它的公有或私有倉(cāng)庫(kù)曙聂,可以指定一個(gè)任意的Maven或者Ivy倉(cāng)庫(kù)的URL并且配置來(lái)使用身份驗(yàn)證,或者可以使用簡(jiǎn)單的文件系統(tǒng)倉(cāng)庫(kù)來(lái)解決依賴關(guān)系鞠鲜。

在項(xiàng)目中定義倉(cāng)庫(kù)的關(guān)鍵是RepositoryHandler接口宁脊,它提供了添加各種類型倉(cāng)庫(kù)的方法断国。從項(xiàng)目上看,這些方法在repositories配置塊中被調(diào)用榆苞。

可以聲明多個(gè)倉(cāng)庫(kù)稳衬,下載依賴的時(shí)候按照聲明的順序來(lái)檢查倉(cāng)庫(kù),倉(cāng)庫(kù)提供了依賴優(yōu)先原則坐漏,對(duì)于特定的依賴后續(xù)的倉(cāng)庫(kù)聲明不會(huì)被進(jìn)一步檢查薄疚。

repositories {
    mavenLocal()
    jcenter()
    maven { url "https://jitpack.io" }
    flatDir {
        dirs 'libs'
    }
}

Gradle API 支持兩種方式來(lái)配置一個(gè)自定義倉(cāng)庫(kù):maven()和mavenRepo()。

repositories {
    maven {
        name 'Custom Maven Repository'
        url 'http://repo.acmp.com/release/'
    }
}

也可以使用Ivy倉(cāng)庫(kù)仙畦,

repositories {
    ivy {
        url 'http://repo.acmp.com/release/'
    }
}

有些Maven倉(cāng)庫(kù)的訪問(wèn)需要憑證输涕,那么可以這樣:

repositories {
    maven {
        url 'http://repo.acmp.com/release/'
        credentials{
            username 'user'
            password 'secretPassword'
        }
    }
}

不建議在構(gòu)建配置文件中存儲(chǔ)憑證,最好是在本地一個(gè)單獨(dú)的未納入版本控制系統(tǒng)的屬性文件存儲(chǔ)憑證

扁平的目錄倉(cāng)庫(kù)
flat目錄是最簡(jiǎn)單和最基本的倉(cāng)庫(kù)形式慨畸。在文件系統(tǒng)中它是一個(gè)單獨(dú)的目錄莱坎,只包含jar文件或者Android 庫(kù)中的aar類型的文件,沒(méi)有maven元數(shù)據(jù)寸士。
當(dāng)聲明依賴時(shí)檐什,你只能使用name和versin屬性,不能使用group屬性弱卡,因?yàn)樗鼤?huì)導(dǎo)致產(chǎn)生不明確的依賴關(guān)系乃正。

dependencies {
    compile name: 'jsoup', version: '1.9.2'
}

repositories {
    flatDir{
        dirs 'flatlibs'
    }
}

2 本地依賴

某些情況下,你可能仍然需要使用手動(dòng)下載的jar文件或原生庫(kù)婶博。
你可以使用Gradle提供的files方法來(lái)添加jar文件作為一個(gè)依賴瓮具,例如:

dependencies{
    compile files('libs/jsoup.jar')
}

如果jar文件很多,我們一個(gè)一個(gè)的這樣依賴太繁瑣凡人,就可以一次添加一個(gè)完成的文件夾:

dependencies{
    compile fileTree('libs')
}

在Android Studio中創(chuàng)建Android項(xiàng)目的時(shí)候名党,新建的Android項(xiàng)目會(huì)有一個(gè)libs文件夾,其會(huì)被聲明為依賴的文件夾挠轴,并且通過(guò)過(guò)濾只依賴jar文件传睹,而不是所有的文件:

dependencies{
    compile fileTree(include: ['*.jar'], dir: 'libs')
}

原生依賴
如果想要使用C或C++編譯的原生依賴庫(kù).so文件,需要指明jniLibs的目錄岸晦。假設(shè).so文件也都放置在libs目錄下欧啤,如圖:

image.png

在腳本文件中就需要這么配置:

android {
    sourceSets {
        main {
            jniLibs.srcDirs = ['libs']
        }
    }
}

依賴項(xiàng)目
如果在項(xiàng)目中創(chuàng)建了一個(gè)模塊作為依賴項(xiàng)目,那么需要在settings.gradle中添加該模塊启上,然后在應(yīng)用模塊中使用它作為依賴邢隧。比如,在Android項(xiàng)目中冈在,app模塊是我們的主模塊府框,library模塊是依賴模塊,也稱作依賴庫(kù)。
settings.gradle 中添加:

include ':app' ,' : library'

app模塊下的build.gradle中添加:

dependencies{
    compile project(':library')
}

使用.aar文件
當(dāng)你已經(jīng)把a(bǔ)ar文件放置在libs目錄下或者其他的扁平文件目錄下迫靖,添加aar文件作為依賴可以這么操作:

compile(name: 'libraryname', ext: 'aar')

這樣就告知Gradle查找具有特定名稱切擴(kuò)展名為.aar的依賴庫(kù)

3 依賴配置

前面我們講了添加依賴庫(kù)的時(shí)候院峡,前面都要有一個(gè)compile。其實(shí)這個(gè)compile就是一個(gè)配置Configuration系宜。
Gradle根據(jù)配置對(duì)依賴進(jìn)行分組照激,比如編譯Java時(shí)使用的是這組依賴,運(yùn)行Java時(shí)又可以使用另一組依賴盹牧。每一組依賴稱為一個(gè)Configuration俩垃,在聲明依賴時(shí),我們實(shí)際上是在設(shè)置不同的Configuration汰寓。
Java插件提供了6個(gè)現(xiàn)成的配置:compile口柳、runtime、testCompile有滑、testRuntime跃闹、archives、default毛好。
而在Android中的插件也提供了幾個(gè)標(biāo)準(zhǔn)配置:compile望艺、apk、provided肌访、testCompile找默、androidTestCompile。
compile 是默認(rèn)的配置吼驶,在編譯主應(yīng)用時(shí)包含所有的依賴惩激,不禁會(huì)將依賴添加至類路徑,還會(huì)生成對(duì)應(yīng)的apk蟹演。
如果依賴使用apk配置风钻,則該依賴只會(huì)被打包到apk,而不會(huì)被添加到編譯類路徑轨帜。
provided配置與apk配置相反魄咕,只在編譯的時(shí)候用到衩椒,其依賴不會(huì)被打包進(jìn)apk蚌父。
testCompile、androidTestCompile配置會(huì)添加用于測(cè)試的額外依賴庫(kù)毛萌,在運(yùn)行測(cè)試相關(guān)的任務(wù)時(shí)會(huì)被用到苟弛。比如添加JUnit或者Espresso測(cè)試框架。

要自定義一個(gè)配置Configuration阁将,我們可以這樣:

configurations {
    myConfiguration {
        description = 'this is  my configuration'
        visible = false
    }
}

我們?cè)谧远x配置的時(shí)候膏秫,同時(shí)定義了該配置的一些屬性,description表示的是該配置的描述信息做盅,visiable表示該配置是否可以在該P(yáng)roject之外可見(jiàn)缤削,默認(rèn)是true窘哈。還可以定義其它的屬性,具體可參考Configuration這個(gè)類亭敢。當(dāng)然滚婉,你也可以什么都不寫。configurations對(duì)應(yīng)的Gradle的Api中ConfigurationContainer
這個(gè)類帅刀。

以上只是定義了一個(gè)名為myConfiguration的配置让腹,我們并未向其中加入依賴】勰纾可以通過(guò)dependencies()方法向myConfiguration中加入實(shí)際的依賴項(xiàng):

dependencies {
   myConfiguration 'org.jsoup:jsoup:1.9.2'
}

repositories {
    mavenCentral()
}

運(yùn)行gradle dependencies 這個(gè)幫助task骇窍,會(huì)顯示當(dāng)前的依賴樹(shù)。此時(shí)可以看到我們?cè)趍yConfiguration這個(gè)配置中依賴的庫(kù):

myConfiguration - this is  my configuration
\--- org.jsoup:jsoup:1.9.2

由于我們只依賴了一個(gè)庫(kù)锥余,所以依賴樹(shù)看著很簡(jiǎn)潔腹纳。如果依賴很多庫(kù),而這些依賴庫(kù)又都有傳遞性依賴哈恰,就有可能發(fā)生依賴沖突只估。如果存在依賴沖突,在默認(rèn)情況下着绷,Gradle會(huì)選擇最新版本蛔钙,這和Maven是不同的,Maven會(huì)選擇離依賴樹(shù)最近的版本荠医。如果你需要更改默認(rèn)的沖突解決策略吁脱,可以自行搜索相關(guān)內(nèi)容,本文就不多做介紹了彬向。

使用Gradle API可以找到Gradle依賴的緩存文件放置的位置兼贡。

task printDependencies << {
    configurations.getByName('myConfiguration').each { dependency ->
        println dependency
    }
}

執(zhí)行gradle printDependencies 命令,可以看到打印結(jié)果:

> Task :printDependencies
/Users/jason/.gradle/caches/modules-2/files-2.1/org.jsoup/jsoup/1.9.2/5e3bda828a80c7a21dfbe2308d1755759c2fd7b4/jsoup-1.9.2.jar

4 動(dòng)態(tài)版本聲明

如果想使用最新版本的依賴娃胆,可以使用占位符 latest.integration 遍希。例如 :

org.jsoup:jsoup:latest-integration

或者,聲明版本屬性里烦,通過(guò)使用一個(gè)加號(hào)(+) 標(biāo)定它來(lái)動(dòng)態(tài)改變:

org.jsoup:jsoup:1.+

當(dāng)然了凿蒜,我們最好是少用或者不用動(dòng)態(tài)版本聲明。

下一篇胁黑,我們開(kāi)始學(xué)習(xí)Gradle中的多項(xiàng)目構(gòu)建废封。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丧蘸,隨后出現(xiàn)的幾起案子漂洋,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刽漂,死亡現(xiàn)場(chǎng)離奇詭異演训,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)贝咙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門仇祭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人颈畸,你說(shuō)我怎么就攤上這事乌奇。” “怎么了眯娱?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵礁苗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我徙缴,道長(zhǎng)试伙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任于样,我火速辦了婚禮疏叨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘穿剖。我一直安慰自己蚤蔓,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布糊余。 她就那樣靜靜地躺著秀又,像睡著了一般。 火紅的嫁衣襯著肌膚如雪贬芥。 梳的紋絲不亂的頭發(fā)上吐辙,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音蘸劈,去河邊找鬼昏苏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛威沫,可吹牛的內(nèi)容都是我干的贤惯。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼壹甥,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼救巷!你這毒婦竟也來(lái)了壶熏?” 一聲冷哼從身側(cè)響起句柠,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后溯职,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體精盅,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年谜酒,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了叹俏。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡僻族,死狀恐怖粘驰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情述么,我是刑警寧澤蝌数,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站度秘,受9級(jí)特大地震影響顶伞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜剑梳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一唆貌、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧垢乙,春花似錦锨咙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至羊壹,卻和暖如春蓖宦,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背油猫。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工稠茂, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人情妖。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓睬关,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親毡证。 傳聞我的和親對(duì)象是個(gè)殘疾皇子电爹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)料睛,斷路器丐箩,智...
    卡卡羅2017閱讀 134,696評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,844評(píng)論 6 342
  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,277評(píng)論 25 707
  • 依賴管理 依賴管理是Gradle最閃耀的地方摇邦,最好的情景是,你僅僅只需添加一行代碼在你的build文件屎勘,Gradl...
    木木00閱讀 461評(píng)論 1 6
  • 依賴管理是Gradle的一個(gè)亮點(diǎn)施籍。在最好的情況下,你只需要在構(gòu)建文件中添加一行代碼概漱,Gradle就可以從遠(yuǎn)程倉(cāng)庫(kù)下...
    sollian閱讀 5,142評(píng)論 0 3