Android - 统一依赖管理 (最新版:version Catalogs)

本文介绍的的最新的一种方式 Version Catalogs。好了,废话不多说,我们开始学习这一种项目统一依赖方式。

介绍

需要注意的是,这个方式是在 Gradle7.0 以上使用的(经过测试,必要要 gradle 7.4.2 以上版本才能解析)。如果当前的应用小于这个版本,建议采用别的方式。当时可以往下看学习学习。

首先,提供 《官方文档 - version catalogs 》给到大家,还是建议大家先看一下官方文档,当然都是英文,可以翻译看看,然后再回来看这篇文章会事半功倍。当然如果直接看也没有关系。

实现方式

本文主要介绍 version catalogs 项目统一依赖管理的两种实现方式。分别是:

  1. 直接在项目的 setting.gradle 文件当中实现
  2. 新建一个 .toml 后缀文件实现

据了解,目前这个方式还是预览版本,所以需要在 项目的 setting.gradle 文件当中手动开启:

// VERSION_CATALOGS当前并不是稳定版本功能
// 所以需要预先开启功能预览 enableFeaturePreview('FEATURE')
enableFeaturePreview("VERSION_CATALOGS")

方式一:

在项目的setting.gradle文件当中,所有代码如下:

//settings.gradle

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

// VERSION_CATALOGS当前并不是稳定版本功能
// 所以需要预先开启功能预览 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(): 这个就是导依赖的路径设置, alias('名字').to('依赖路径').versionRef('版本号名称')。
  • bundle(): 组合,将已经定义的依赖组合到一起,可理解为依赖数组。bundle(名字',['依赖名字','依赖名字'])

其中,如果不定义version版本号,那么可以直接写成:

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

不过还是建议大家分开来,统一下version版本号。这里再举例一下怎拆分,例如,我们需要导入一个依赖:

implementation 'androidx.appcompat:appcompat:1.3.0'

那么我们就可拆分成这样:

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

这就是第一种编写方式,但是这种方式有一种弊端,当我们项目依赖越来越多的时候,dependencyResolutionManagement这个方法就会越来越长。并且这个 setting.gradle 不止单单放我们的导入依赖的代码,也有我们导入库的地址代码等等,不够单一。

所以我们有了第二种,创建一个单独文件的方式。

方式二:

在项目的根目录下(也就是 setting.gradle 同级目录),创建一个后缀名为 .toml 的文件,名字自定,我这里创建了 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]。分别为[版本][依赖][组合][插件]。我们直接照搬就好。经过测试第四个[plugins]不太稳定,有时候会报错,可不写。

我们文件创建好,编码完毕之后呢,需要在我们方法一的地方增加一行代码,导入我们新建的这个文件。代码如下:

//setting.gradle

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

其实也就是将我们方法一里面的所有代码,写到了单独的文件里面,然后再单独导入这个文件。

具体使用

两种方式的实现,使用方法都是一样的。我们在项目的 build.gradle文件里面就可以直接写入代码啦。写之前记得点击一下 死丢丢 的那个小象。重新构建一下项目。

当 死丢丢 构建完毕之后哦,我们就可以去到项目的 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 之后就会有相对应的提示啦。在依赖里面的使用如下:

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

    ......
}


注意事项

需要注意的是,如果你定义名字的时候,使用了下划线。那么导入的时候需要多一个层级,什么意思呢?如果你输入的名字是如下类似的:

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

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

那么在导入依赖的时候就需要如下写法:

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

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

可以简单理解为,它会自动把 _ 转为 . ,并且需要注意的是,在编码的过程中,代码可能会提示 libs()的代码块,如果使用这个,构建会报错(具体原因没有深入研究)。总之,我们先手动输入 libs 就不会出现问题啦。

总结

以上就是本篇文章的全部内容。这种项目依赖管理方式必须在高版本的gradle上面实现,实现有两种:

  • 项目的 setting.gradle 文件
  • 创建一个新的 .toml 后缀名文件

两个方式的区别,也写在了文章上面,至于采用哪种方式,就看各位的喜好了。唯一需要注意的就是在命名的时候,输入下划线的导入区别。参考上面的注意事项。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容