Kotlin + buildSrc:更好的管理Gadle依賴(lài)

為了充分利用Android Plugin for Gradle 3.0+的優(yōu)點(diǎn)琐谤,將Android項(xiàng)目拆分成多個(gè)module的做法越來(lái)越常見(jiàn)磕蒲。然而蓖乘,隨著module數(shù)量的增多,我們很快就會(huì)遇到依賴(lài)管理的混亂問(wèn)題峦睡。

管理Gradle依賴(lài)的三種不同方法:

  • 手動(dòng)管理
  • 使用Google推薦的“ext”
  • Kotlin + buildSrc

1翎苫、手動(dòng)管理

這是一種大多數(shù)人在采用的管理依賴(lài)的方法,但每次升級(jí)依賴(lài)庫(kù)時(shí)都需要做大量的手動(dòng)更改榨了。

module_a/build.gradle
implementation "com.android.support:support-annotations:27.0.2"
implementation "com.android.support:appcompat-v7:27.0.2"
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.9"
module_b/build.gradle
implementation "com.android.support:support-annotations:27.0.2"
implementation "com.android.support:appcompat-v7:27.0.2"
implementation "com.squareup.retrofit2:retrofit:2.3.0"
implementation "com.squareup.retrofit2:adapter-rxjava2:2.3.0"
implementation "io.reactivex.rxjava2:rxjava:2.1.9"

這里存在許多重復(fù)的配置煎谍,而且當(dāng)你的項(xiàng)目有很多module時(shí)很難管理依賴(lài)庫(kù)的版本更新。

Google推薦:使用gradle的extra屬性

Google在Android官方文檔中推薦這種管理依賴(lài)的方法龙屉。許多項(xiàng)目例如ButterKnife呐粘、Picasso等都在使用這種方法。

此方法非常適用于更新support library的版本,因?yàn)槊總€(gè)support library都具有相同的版本號(hào)事哭,你只需要在一個(gè)地方更改它就行了。Retrofit等其它第三方庫(kù)也是如此瓜富。

Root-level build.gradle
ext {
  versions = [
    support_lib: "27.0.2",
    retrofit: "2.3.0",
    rxjava: "2.1.9"
  ]
  libs = [
    support_annotations: "com.android.support:support-annotations:${versions.support_lib}",
    support_appcompat_v7: "com.android.support:appcompat-v7:${versions.support_lib}",
    retrofit :"com.squareup.retrofit2:retrofit:${versions.retrofit}",
    retrofit_rxjava_adapter: "com.squareup.retrofit2:adapter-rxjava2:${versions.retrofit}",
    rxjava: "io.reactivex.rxjava2:rxjava:${versions.rxjava}"
  ]
}
module_a/build.gradle
implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava
module_b/build.gradle
implementation libs.support_annotations
implementation libs.support_appcompat_v7
implementation libs.retrofit
implementation libs.retrofit_rxjava_adapter
implementation libs.rxjava

這種方法是手動(dòng)管理的一大進(jìn)步鳍咱,但是缺少I(mǎi)DE的支持,更準(zhǔn)確的說(shuō)是在更新依賴(lài)庫(kù)的時(shí)候IDE不能自動(dòng)補(bǔ)全与柑。

Kotlin + buildSrc == Android Studio Autocomplete ?? ??

您需要在您的項(xiàng)目里創(chuàng)建一個(gè)buildSrc模塊谤辜,然后編寫(xiě)kotlin代碼來(lái)管理依賴(lài)庫(kù),使得IDE支持自動(dòng)補(bǔ)全价捧。

Gradle文檔中有這樣一段話:

當(dāng)你運(yùn)行Gradle時(shí)丑念,它會(huì)檢查項(xiàng)目中是否存在一個(gè)名為buildSrc的目錄。然后Gradle會(huì)自動(dòng)編譯并測(cè)試這段代碼结蟋,并將其放入構(gòu)建腳本的類(lèi)路徑中脯倚。您不需要提供任何進(jìn)一步的操作提示。

你只需要在buildSrc module中新建兩個(gè)文件:

  • build.gradle.kts
  • 編寫(xiě)Kotlin代碼的文件 (本文中是指Dependencies.kt)
buildSrc/build.gradle.kts:
plugins {
    `kotlin-dsl`
}

buildSrc/src/main/java/Dependencies.kt

object Versions {
    val support_lib = "27.0.2"
    val retrofit = "2.3.0"
    val rxjava = "2.1.9"
}

object Libs {
 val support_annotations = "com.android.support:support-annotations:${Versions.support_lib}"
 val support_appcompat_v7 = "com.android.support:appcompat-v7:${Versions.support_lib}"
 val retrofit = "com.squareup.retrofit2:retrofit:${Versions.retrofit}"
 val retrofit_rxjava_adapter = "com.squareup.retrofit2:adapter-rxjava2:${Versions.retrofit}"
 val rxjava = "io.reactivex.rxjava2:rxjava:${Versions.rxjava}"
}

經(jīng)過(guò)上面兩個(gè)步驟后嵌屎,執(zhí)行一次Gradle Sync任務(wù)推正,現(xiàn)在我們可以在Android Studio中訪問(wèn)Dependencies.kt中任何值了。

看起來(lái)結(jié)果與“ext”非常相似宝惰,但是它支持自動(dòng)補(bǔ)全和單擊跳轉(zhuǎn)植榕。

module_a/build.gradle
implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava
module_a/build.gradle
implementation Libs.support_annotations
implementation Libs.support_appcompat_v7
implementation Libs.retrofit
implementation Libs.retrofit_rxjava_adapter
implementation Libs.rxjava

結(jié)束語(yǔ)

我強(qiáng)烈推薦您使用“Kotlin + buildSrc”的方法。它支持自動(dòng)補(bǔ)全和單擊跳轉(zhuǎn)尼夺,使得您無(wú)需在文件之間手動(dòng)來(lái)回切換尊残,方便你更好的管理Gradle依賴(lài)。

動(dòng)手實(shí)踐:

新建的module名稱(chēng)必須為buildSrc

一開(kāi)始我按照作者原文的描述淤堵,在Android Studio里右鍵單擊項(xiàng)目寝衫,New 出一個(gè)名為buildSrcAndroid Library,試了好幾遍都提示“Gradle sync failed: Plugin with id 'com.android.library' not found”的錯(cuò)誤粘勒。

后來(lái)我參考這里的做法竞端,手動(dòng)創(chuàng)建了buildSrc這個(gè)模塊。步驟如下:

  • 1庙睡、在項(xiàng)目根目錄下新建一個(gè)名為buildSrc的文件夾(與項(xiàng)目里的app文件夾同級(jí))事富。

  • 2、在buildSrc文件夾里創(chuàng)建名為build.gradle.kts的文件乘陪,文件內(nèi)容參考之前的描述统台。

  • 3、在buildSrc文件夾里創(chuàng)建src/main/java文件夾啡邑,并在該文件夾下創(chuàng)建Dependencies.kt文件贱勃,文件內(nèi)容參考之前的描述。

  1. build一遍你的項(xiàng)目,然后重啟你的Android Studio贵扰,項(xiàng)目里就會(huì)多出一個(gè)名為buildSrc的module仇穗。

文末

您的點(diǎn)贊收藏就是對(duì)我最大的鼓勵(lì)!
歡迎關(guān)注我戚绕,分享Android干貨纹坐,交流Android技術(shù)。

更多Kotlin 可以查看我的個(gè)人介紹N璐浴T抛印!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末球切,一起剝皮案震驚了整個(gè)濱河市谷誓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌吨凑,老刑警劉巖捍歪,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異鸵钝,居然都是意外死亡费封,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)蒋伦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)弓摘,“玉大人,你說(shuō)我怎么就攤上這事痕届∪拖祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵研叫,是天一觀的道長(zhǎng)锤窑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)嚷炉,這世上最難降的妖魔是什么渊啰? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮申屹,結(jié)果婚禮上绘证,老公的妹妹穿的比我還像新娘。我一直安慰自己哗讥,他們只是感情好嚷那,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著杆煞,像睡著了一般魏宽。 火紅的嫁衣襯著肌膚如雪腐泻。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼椭盏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窄坦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凳寺,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼彤侍!你這毒婦竟也來(lái)了肠缨?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤盏阶,失蹤者是張志新(化名)和其女友劉穎晒奕,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體名斟,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡脑慧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了砰盐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片闷袒。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖岩梳,靈堂內(nèi)的尸體忽然破棺而出囊骤,到底是詐尸還是另有隱情,我是刑警寧澤冀值,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布也物,位于F島的核電站,受9級(jí)特大地震影響列疗,放射性物質(zhì)發(fā)生泄漏滑蚯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一抵栈、第九天 我趴在偏房一處隱蔽的房頂上張望告材。 院中可真熱鬧,春花似錦古劲、人聲如沸创葡。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)灿渴。三九已至洛波,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骚露,已是汗流浹背蹬挤。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棘幸,地道東北人焰扳。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像误续,于是被迫代替她去往敵國(guó)和親吨悍。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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