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

前语

几个月前,我发布了一个 《Android – 一致依靠办理(config.gradle)》文章,评论区很多帅哥靓女说,这种办法已通过时了。如图:

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

细心一想,之前的办法确实是有很多的坏处,而且不太方便。所以现在开端学习最新的一种办法:Version Catalogs 办法对项目进行依靠办理。

接下来,我将会创立一个Android一致依靠专栏,包含四大办法:

  • config.gradle 对应文章:《Android – 一致依靠办理(config.gradle)》
  • buildSrc
  • composing builds
  • version Catalogs 对应文章:《Android – 一致依靠办理 (version Catalogs)》

以上根本便是现在Android一致项目办理的所有办法(官方)。本文介绍的的最新的一种办法 Version Catalogs。好了,废话不多说,咱们开端学习这一种项目一致依靠办法。

介绍

需求留意的是,这个办法是在 Gradle7.0 以上运用的(通过测验,必需求 gradle 7.4.2 以上版别才干解析)。假如当时的运用小于这个版别,主张选用别的办法。可是能够往下看学习学习。

首要,供给 《官方文档 – version catalogs 》给到咱们,仍是主张咱们先看一下官方文档,当然都是英文,能够翻译看看。

评论区帅哥靓仔供给了一个中文官方教程地址 《将 build 迁移到版别目录》

当然也可直接看本篇文章。

完成办法

本文首要介绍 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 的文件,如下图:

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

文件里边代码如下:

//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 后缀名文件

两个办法的区别,也写在了文章上面,至于选用哪种办法,就看各位的喜好了。仅有需求留意的便是在命名的时分,输入下划线的导入区别。参阅上面的留意事项。

本篇文章示例代码,请跳转观看 《verison_control_verisonCatalogs》 而且还有三篇相似项目一致办理依靠文章供你观看:

  • 文章:《Android – 一致依靠办理(config.gradle)》
  • 文章:编写中
  • 文章:编写中

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