Android - 統(tǒng)一依賴管理 (最新版:version Catalogs)

本文介紹的的最新的一種方式 Version Catalogs间学。好了,廢話不多說淹办,我們開始學(xué)習(xí)這一種項目統(tǒng)一依賴方式。

介紹

需要注意的是恶复,這個方式是在 Gradle7.0 以上使用的(經(jīng)過測試怜森,必要要 gradle 7.4.2 以上版本才能解析)速挑。如果當(dāng)前的應(yīng)用小于這個版本,建議采用別的方式副硅。當(dāng)時可以往下看學(xué)習(xí)學(xué)習(xí)姥宝。

首先,提供 《官方文檔 - version catalogs 》給到大家恐疲,還是建議大家先看一下官方文檔腊满,當(dāng)然都是英文,可以翻譯看看培己,然后再回來看這篇文章會事半功倍碳蛋。當(dāng)然如果直接看也沒有關(guān)系。

實現(xiàn)方式

本文主要介紹 version catalogs 項目統(tǒng)一依賴管理的兩種實現(xiàn)方式省咨。分別是:

  1. 直接在項目的 setting.gradle 文件當(dāng)中實現(xiàn)
  2. 新建一個 .toml 后綴文件實現(xiàn)

據(jù)了解肃弟,目前這個方式還是預(yù)覽版本,所以需要在 項目的 setting.gradle 文件當(dāng)中手動開啟:

// VERSION_CATALOGS當(dāng)前并不是穩(wěn)定版本功能
// 所以需要預(yù)先開啟功能預(yù)覽 enableFeaturePreview('FEATURE')
enableFeaturePreview("VERSION_CATALOGS")

方式一:

在項目的setting.gradle文件當(dāng)中零蓉,所有代碼如下:

//settings.gradle

pluginManagement {
    repositories {
        google()
        mavenCentral()
        gradlePluginPortal()
        maven { url "https://jitpack.io" }
    }
}

// VERSION_CATALOGS當(dāng)前并不是穩(wěn)定版本功能
// 所以需要預(yù)先開啟功能預(yù)覽 enableFeaturePreview('FEATURE')
enableFeaturePreview("VERSION_CATALOGS")

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
        maven { url "https://jitpack.io" }
    }

    versionCatalogs{
        libs{
         
            version('compileSdk','33')
            version('minSdk','21')
            version('targetSdk','32')
            
            version('coreKtx','1.7.0')
            version('appcompat','1.3.0')
            version('material','1.4.0')
            version('constraintLayout','2.1.3')
          
            ......


            alias('imp_coreKtx').to('androidx.core','core-ktx').versionRef('coreKtx')
            alias('imp_appcompat').to('androidx.appcompat','appcompat').versionRef('appcompat')
            alias('imp_material').to('com.google.android.material','material').versionRef('material')
            alias('imp_constraintLayout').to('androidx.constraintlayout','constraintLayout').versionRef('constraintLayout')
            
            ......

            //組合
            bundle('android_base',['imp_coreKtx','imp_appcompat','imp_material'])
       
        }
    }
}
rootProject.name = "LeoDevMvpKotlinDemo"
include ':app
include ':lib_fast_dev_mvp_kt'


我們只需要在 dependencyResolutionManagement 增加代碼即可笤受,下面我們來解釋一下如何使用的:

  • version(): 顧名思義,這個是寫版本號的敌蜂, version(‘名字’箩兽,‘版本號’)。
  • alias().to().versionRef(): 這個就是導(dǎo)依賴的路徑設(shè)置章喉, alias('名字').to('依賴路徑').versionRef('版本號名稱')比肄。
  • bundle(): 組合,將已經(jīng)定義的依賴組合到一起囊陡,可理解為依賴數(shù)組芳绩。bundle(名字',['依賴名字','依賴名字'])

其中,如果不定義version版本號撞反,那么可以直接寫成:

alias('imp_coreKtx').to('androidx.core','core-ktx').version('1.7.0)

不過還是建議大家分開來妥色,統(tǒng)一下version版本號。這里再舉例一下怎拆分遏片,例如嘹害,我們需要導(dǎo)入一個依賴:

implementation 'androidx.appcompat:appcompat:1.3.0'

那么我們就可拆分成這樣:

version('version_appcompat','1.3.0')
alias('imp_appcompat').to('androidx.appcompat','appcompat').versionRef('version_appcompat')

這就是第一種編寫方式,但是這種方式有一種弊端吮便,當(dāng)我們項目依賴越來越多的時候笔呀,dependencyResolutionManagement這個方法就會越來越長。并且這個 setting.gradle 不止單單放我們的導(dǎo)入依賴的代碼髓需,也有我們導(dǎo)入庫的地址代碼等等许师,不夠單一。

所以我們有了第二種,創(chuàng)建一個單獨文件的方式微渠。

方式二:

在項目的根目錄下(也就是 setting.gradle 同級目錄)搭幻,創(chuàng)建一個后綴名為 .toml 的文件,名字自定逞盆,我這里創(chuàng)建了 project.version.toml 的文件檀蹋,如下圖:

1.png

文件里面代碼如下:

//project.version.toml

[versions]
compileSdk = "33"
minSdk = "21"
targetSdk = "32"
versionCode = "1"
versionName = "1.0.0"

coreKtx = "1.7.0"
appcompat = "1.3.0"
material = "1.4.0"
constraintlayout = "2.1.3"

[libraries]
coreKtx = { module = "androidx.core:core-ktx", version.ref = "coreKtx" }
appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" }
material = { module = "com.google.android.material:material", version.ref = "material"}
constraintlayout = { module = "androidx.constraintlayout:constraintlayout", version.ref = "constraintlayout" }


[bundles]
andorid_base = ["coreKtx","appcompat","material","constraintlayout"]

[plugins]
application = { id = "com.android.application"}


這里主要分為四個部分,[versions],[libraries],[bundles],[plugins]云芦。分別為[版本]俯逾,[依賴][組合]舅逸,[插件]纱昧。我們直接照搬就好。經(jīng)過測試第四個[plugins]不太穩(wěn)定堡赔,有時候會報錯识脆,可不寫。

我們文件創(chuàng)建好善已,編碼完畢之后呢灼捂,需要在我們方法一的地方增加一行代碼,導(dǎo)入我們新建的這個文件换团。代碼如下:

//setting.gradle

dependencyResolutionManagement {
    versionCatalogs {
        libs {
        
              from(files("./project.verisons.toml"))
              
        }
    }
}

其實也就是將我們方法一里面的所有代碼悉稠,寫到了單獨的文件里面,然后再單獨導(dǎo)入這個文件艘包。

具體使用

兩種方式的實現(xiàn)的猛,使用方法都是一樣的。我們在項目的 build.gradle文件里面就可以直接寫入代碼啦想虎。寫之前記得點擊一下 死丟丟 的那個小象卦尊。重新構(gòu)建一下項目。

當(dāng) 死丟丟 構(gòu)建完畢之后哦舌厨,我們就可以去到項目的 build.gradle文件里 coding 啦岂却,使用如下:

android {
    namespace 'leo.dev.mvp.kt'
    compileSdk libs.versions.compileSdk.get().toInteger()

    defaultConfig {
        applicationId "leo.dev.mvp.kt"
        minSdk libs.versions.minSdk.get().toInteger()
        targetSdk libs.versions.targetSdk.get().toInteger()
        versionCode libs.versions.versionCode.get().toInteger()
        versionName libs.versions.versionName.get().toString()

        testInstrumentationRunner libs.versions.testInstrumentationRunner.get().toString()
    }
    
    ......
 }

我們在輸入的時候,輸入 libs 之后就會有相對應(yīng)的提示啦裙椭。在依賴?yán)锩娴氖褂萌缦拢?/p>

dependencies {
    
    //bundle
    implementation libs.bundles.andorid.base
    implementation libs.bundles.smart.refresh
    
    implementation libs.bundles.net
    implementation libs.bundles.junit

    ......
}


注意事項

需要注意的是躏哩,如果你定義名字的時候,使用了下劃線揉燃。那么導(dǎo)入的時候需要多一個層級扫尺,什么意思呢?如果你輸入的名字是如下類似的:

//方式一:
alias('imp_coreKtx').to('androidx.core','core-ktx').versionRef('coreKtx')

//方式二:
andorid_base = ["coreKtx","appcompat","material","constraintlayout"]
    

那么在導(dǎo)入依賴的時候就需要如下寫法:

//方式一:
implementation libs.imp.coreKtx

//方式二:
implementation libs.bundles.andorid.base
    

可以簡單理解為炊汤,它會自動把 _ 轉(zhuǎn)為 . 正驻,并且需要注意的是弊攘,在編碼的過程中,代碼可能會提示 libs()的代碼塊拨拓,如果使用這個肴颊,構(gòu)建會報錯(具體原因沒有深入研究)氓栈≡祝總之,我們先手動輸入 libs 就不會出現(xiàn)問題啦授瘦。

總結(jié)

以上就是本篇文章的全部內(nèi)容醋界。這種項目依賴管理方式必須在高版本的gradle上面實現(xiàn),實現(xiàn)有兩種:

  • 項目的 setting.gradle 文件
  • 創(chuàng)建一個新的 .toml 后綴名文件

兩個方式的區(qū)別提完,也寫在了文章上面形纺,至于采用哪種方式,就看各位的喜好了徒欣。唯一需要注意的就是在命名的時候逐样,輸入下劃線的導(dǎo)入?yún)^(qū)別。參考上面的注意事項打肝。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脂新,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子粗梭,更是在濱河造成了極大的恐慌争便,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件断医,死亡現(xiàn)場離奇詭異滞乙,居然都是意外死亡,警方通過查閱死者的電腦和手機鉴嗤,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進(jìn)店門斩启,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人醉锅,你說我怎么就攤上這事浇垦。” “怎么了荣挨?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵男韧,是天一觀的道長。 經(jīng)常有香客問我默垄,道長此虑,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任口锭,我火速辦了婚禮朦前,結(jié)果婚禮上介杆,老公的妹妹穿的比我還像新娘。我一直安慰自己韭寸,他們只是感情好春哨,可當(dāng)我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著恩伺,像睡著了一般赴背。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晶渠,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天凰荚,我揣著相機與錄音,去河邊找鬼褒脯。 笑死便瑟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的番川。 我是一名探鬼主播到涂,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼颁督!你這毒婦竟也來了践啄?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤适篙,失蹤者是張志新(化名)和其女友劉穎往核,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體嚷节,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡聂儒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了硫痰。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衩婚。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖效斑,靈堂內(nèi)的尸體忽然破棺而出非春,到底是詐尸還是另有隱情,我是刑警寧澤缓屠,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布奇昙,位于F島的核電站,受9級特大地震影響敌完,放射性物質(zhì)發(fā)生泄漏储耐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一滨溉、第九天 我趴在偏房一處隱蔽的房頂上張望什湘。 院中可真熱鬧长赞,春花似錦、人聲如沸闽撤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哟旗。三九已至贩据,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間热幔,已是汗流浹背乐设。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工讼庇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留绎巨,地道東北人。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓蠕啄,卻偏偏與公主長得像场勤,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歼跟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,960評論 2 355

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