首页 > 其他分享 >迁移到 Gradle 7.x 使用 Version Catalogs 管理依赖

迁移到 Gradle 7.x 使用 Version Catalogs 管理依赖

时间:2023-05-13 19:36:35浏览次数:47  
标签:依赖 Catalogs version junit gradle Version libs Gradle lifecycle

一、根目录下 build.gradle 变更

变更前:

buildscript {
    ext.kotlin_version = '1.5.0'

    repository {
    repository {
        mavenCentral()
        jcenter()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.0.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10"
        classpath "com.google.protobuf:protobuf-gradle-plugin:0.8.17"

        // 自定义 gradle 插件
        classpath "com.sharpcj.plugin:abc:1.0.6"
    }
}


allprojects {
    repositories {
        mavenCentral()
        jcenter()
        maven {
            url "http://xx.xx.xx.xx:xxxx/xx/xx/"
        }
    }    
}

变更后:

根目录下的 buildscript 变更到 settings.gradle 中

setting.gradle

pluginManagement {
    repositories {
        gradlePluginPortal()
        google()
        mavenCentral()
        maven {
            allowInsecureProtocol = true
            url "http://xx.xx.xx.xx:xxxx/xx/xx/"
        }
}
dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
        maven { url 'https://jitpack.io' }
        maven {
            allowInsecureProtocol = true
            url "http://xx.xx.xx.xx:xxxx/xx/xx/"
        }
    }
}

gradle 7.0.x 以上对于 http 协议的的仓库地址,需要显示声明:allowInsecureProtocol = true

根目录下 build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

// 全局 buildescript 依旧可以用
buildscript {
    ext.kotlin_version = '1.5.0'

    // 自定义 gradle 插件
    dependencies {
        classpath "com.sharpcj.plugin:abc:1.0.6"
    }
}

plugins {
    id 'com.android.application' version '7.3.1' apply false
    id 'com.android.library' version '7.3.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.7.20' apply false
    id 'com.google.protobuf' version '0.8.17' apply false
}

二、引入 aar 包gradle

7.0.x 以前:

  1. 将aar文件复制到libs文件夹中

  2. 在 model 下 build.gradle 中的 android {} 外层添加:

repositories {
    flatDir {
        dirs 'libs'
    }
}
  1. 在 dependencies 中加入
implementation files('libs/xxx.jar')

或者:

implementation(fileTree("libs"));

7.0.x 以上:

  1. 将aar文件复制到libs文件夹中
  2. build.gradle的dependencies中加入:
implementation(fileTree("libs"));

三、Version Catalogs —— 全新的管理依赖方式

3.1 此前的 Android 统一依赖管理的方式

3.1.1 传统apply from的方式

为了对模块进行统一管理,会在根目录新建一个config.gradle文件或者在根目录的build.gradle定义一些变量

ext {
    // ...
}

模块下的 build.gradle 使用则通过 apply 方式引入。 添加

apply from "config.gradle"

3.1.2 buildSrc方式

什么是 buildSrc

当运行 Gradle 时会检查项目中是否存在一个名为 buildSrc 的目录。然后 Gradle 会自动编译并测试这段代码,并将其放入构建脚本的类路径中, 对于多项目构建,只能有一个 buildSrc 目录,该目录必须位于根项目目录中, buildSrc 是 Gradle 项目根目录下的一个目录,它可以包含我们的构建逻辑,与脚本插件相比,buildSrc 应该是首选,因为它更易于维护、重构和测试代码

特点

共享 buildSrc 库工件的引用,全局只有一个地方可以修改它。

优点

支持自动补全,支持跳转。

缺点

依赖更新将重新构建整个项目。

3.1.3 Composing builds

什么是Composing builds

复合构建只是包含其他构建的构建. 在许多方面,复合构建类似于 Gradle 多项目构建,不同之处在于,它包括完整的 builds ,而不是包含单个 projects。

特点

拥有buildSrc的优点,同时依赖更新不用重新构建整个项目

3.2 Verison Catalogs 管理

3.2.1 Version Catalogs 特点

  • 对所有module可见,可统一管理所有module的依赖,Gradle会为每个依赖目录生成一个类型安全的访问器,如:libs.coreKtx。 每个依赖目录对构建项目都是可见的,确保依赖项的版本适用于每个子项目或模块
  • 依赖项除了可以声明为单个依赖目录,还可以将多个依赖项声明为依赖目录组。即支持声明依赖bundles, 即总是一起使用的依赖可以组合在一起,
  • 支持版本号与依赖名分离,可以在多个依赖间共享版本号
  • 支持在单独的libs.versions.toml文件中配置依赖
  • 支持在项目间共享依赖

3.2.2 启用 version Catalogs

由于此前 Version Catalogs 属于孵化中的特效,使用它之前需要启用该特性。
在 settings.gradle 中添加如下代码:

settings.gradle

pluginManagement {
	 ...
}

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

dependencyResolutionManagement {
	...
}

但是当我使用 gradle 8.0 的时候,我发现该特性已经是稳定版本了,直接使用即可。无需再启用。在网上看到有说是从 gradle-7.4.1-src 版本开始转为正式版的。有待考证。实际使用的时候,如果编译报错提示了就加上。

3.2.3 使用 version catalog

声明 version catalogs

一种方式是直接在 Settings.gradle 中声明,如下:

settings.gradle

dependencyResolutionManagement {
    
		......

    // 编写版本目录的依赖库
    versionCatalogs {
        libs {
            // 分别声明依赖别名('coreKtx'),groupId('androidx.core'),artifactId('core-ktx')以及版本('1.7.0')
            alias('coreKtx').to('androidx.core', 'core-ktx').version('1.7.0')
            alias('appcompat').to('androidx.appcompat', 'appcompat').version('1.3.0')
            alias('material').to('com.google.android.material', 'material').version('1.4.0')
            alias('constraintlayout').to('androidx.constraintlayout', 'constraintlayout').version('2.0.4')
            alias('junit-junit').to('junit', 'junit').version('4.13.2')
            alias('junit-ext').to('androidx.test.ext', 'junit').version('1.1.3')
            alias('junit-espresso').to('androidx.test.espresso', 'espresso-core').version('3.4.0')
        
        
            // 针对对个相同版本号的依赖,我们可以定一个通用版本号,即将依赖与版本单独声明并引用
            version('lifecycle', '2.2.0')
            alias('lifecycleExtensions').to('androidx.lifecycle', 'lifecycle-extensions').versionRef('lifecycle')
            alias('lifecycleRuntime').to('androidx.lifecycle', 'lifecycle-runtime-ktx').versionRef('lifecycle')

			// 除了单个依赖声明,我们也可以将多个依赖项声明为一个依赖组
            bundle('appBaseLib', ['coreKtx', 'appcompat', 'material', 'constraintlayout'])

            // 声明一个插件
             alias('kotlin-kapt').toPluginId('org.jetbrains.kotlin.kapt').version("1.7.0")
             alias('kotlin-parcelize').toPluginId('org.jetbrains.kotlin.plugin.parcelize').version("1.7.0")
				}
    }
}

使用 version catalogs

plugins {
	......

    // 使用版本目录中声明的插件
    alias libs.plugins.kotlin.kapt
    alias libs.plugins.kotlin.parcelize
}

......

dependencies {
    // 依赖单个制定的版本目录
    implementation libs.coreKtx
    implementation libs.appcompat
    implementation libs.material
    implementation libs.constraintlayout

    implementation libs.lifecycleExtensions
    implementation libs.lifecycleRuntime

    testImplementation libs.junit.junit
    androidTestImplementation libs.junit.ext
    androidTestImplementation libs.junit.espresso

    // 依赖版本目录组
    // implementation libs.bundles.appBaseLib
}

通过 TOML 文件声明 version catalogs

除了在 settings.gradle 文件中直接声明依赖目录,官方更推荐使用 TOML 文件来声明依赖目录

首先在项目根目录下创建 libs.versions.toml 文件,文件名可以任意取,并编写如下依赖内容:

[versions]
kotlin = "1.7.0"
appcompat = "1.3.0"
material = "1.4.0"
constraintlayout = "2.0.4"
lifecycle = "2.2.0"

[libraries]
coreKtx = { module = "androidx.core:core-ktx", version.ref = "kotlin" }
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" }
lifecycleExtensions = { module = "androidx.lifecycle:lifecycle-extensions", version.ref = "lifecycle" }
lifecycleRuntime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle" }
junit-junit = { module = "junit:junit", version = "4.13.2" }
junit_ext = { module = "androidx.test.ext:junit", version = "1.1.3" }
junit_espresso = { module = "androidx.test.espresso:espresso-core", version = "3.4.0" }

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

[plugins]
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
kotlin-parcelize = { id = "org.jetbrains.kotlin.plugin.parcelize", version.ref = "kotlin" }

随后在 setting.gradle 中引用该 TOML 文件

settings.gradle

dependencyResolutionManagement {
    
    ......


    // 第二种方式使用版本目录
    libs {
        from(files("./libs.versions.toml"))
    }
}

然后在app build.gradle 中使用 TOML 文件中声明的依赖

......

dependencies {

    implementation libs.bundles.appBaseLib

    implementation libs.lifecycleExtensions
    implementation libs.lifecycleRuntime

    testImplementation libs.junit.junit
    androidTestImplementation libs.junit.ext
    androidTestImplementation libs.junit.espresso
}

TOML 文件的使用说明

  1. TOML 文件由4个主要部分组成
    [versions] 用于声明可以被依赖项引用的版本
    [libraries] 用于声明依赖的别名
    [bundles] 用于声明依赖包(依赖组)
    [plugins] 用于声明插件

不可随意自定义 TOML 文件中的节点,否则会报错提示只能使用 versionslibrariesbundlespluginsmetadata 中的一个。关于 metadata 的作用暂且不清楚,查阅 gradle 官方文档也只提到前四个。

  1. 在使用 TOML 文件时,默认名是 libs, 如果创建的文件放置于 project/gradle/ 目录下面,则在 settings.gradle 文件中可以省略声明。建议显示声明。

  2. 声明 libraries 时,可以使用

coreKtx = { module = "androidx.core:core-ktx", version.ref = "kotlin" }

或者

coreKtx = { group = "androidx.core", name = "core-ktx", version.ref = "kotlin" }

  1. TOML 文件中变量命名大小写敏感,且以小写字母开头, 命名中可以如包含 - 或者 _或者. ,在相当于分组了。举例说明:
coreKtx = { module = "androidx.core:core-ktx", version.ref = "kotlin" }
lifecycle_runtime = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle"}
lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-runtime-ktx", version.ref = "lifecycle"}

在使用时分别为:

implementation libs.coreKtx
implementation libs.lifecycle.runtime
implementation libs.lifecycle.viewmodel
  1. 最后 TOML 还可以发布到远程仓库

四、参考资料

【Gradle7.0】依赖统一管理的全新方式,了解一下~

Version Catalog(中央依赖声明,即:版本目录)

Android 官方建议迁移至 Version Catalogs

Version Catalogs Gradle 官方页面

标签:依赖,Catalogs,version,junit,gradle,Version,libs,Gradle,lifecycle
From: https://www.cnblogs.com/joy99/p/17397989.html

相关文章

  • 【五期邹昱夫】CCF-A(NeurIPS'21)Gradient inversion with generative image prior
    "JeonJ,LeeK,OhS,etal.Gradientinversionwithgenerativeimageprior[J].Advancesinneuralinformationprocessingsystems,2021,34:29898-29908."  本文提出了一种基于预训练模型的梯度反演方法。该方法通过使用潜在空间搜索优化维度较低的特征向量,减少......
  • Codeforces 1781H1 - Window Signals (easy version)
    很套路的一道题,把F1写了,F2感觉和F1gap不太大就懒得写了/shui首先需要明白大致思路:直接计算\(2^{nm-k}-1\)之所以会算重,是因为对于同一种图案,可能把它放在很多位置都是合法的。那么显然我们需要选一个代表元来把它的贡献唯一化,非常自然的想法就是把它固定在最左上角那个合......
  • gradle 多模块项目
    目录开始新建项目文件blogs使用gradleinit命令初始化项目生成一个gradle应用此时包含一个APP单应用eclipse导入gradle项目新建文件夹project-admin,project-api重新导入blogs项目,生成多模块项目修改settings.gradle/**ThisfilewasgeneratedbytheGradle......
  • CF1824B2 LuoTianyi and the Floating Islands (Hard Version) - 概率期望 - 树的重心
    题目链接:https://codeforces.com/contest/1824/problem/B2题解:考虑一棵\(n\)个点的树,假如已经选定了\(k\)个特殊点,如何判断某一个点是否为好点?显然将这个点提到根没有影响,那么好点的充要条件是对于所有子树的\(S_u\)值都\(\leqk/2\),这里\(S\)代表\(u\)子树中的特殊......
  • Gradle 下载安装
    官网下载地址: https://services.gradle.org/distributions/ 如下图所示,我们选择想要安装的发布版本,gradle-x.x-bin.zip是需要下载的安装发布版,gradle-x.x-src.zip是源码,gradle-x.x-all.zip则是下载全部的文件。我本地为gradle-4.7-rc-2-bin\gradle-4.7-rc-23、配置Gradle......
  • You have an error in your SQL syntax; check the manual that corresponds to your
    问题描述显示在条件查询的sql语句那里报错问题解决本来我是习惯了使用servlet写数据库操作的,然后就直接忽略掉了,或者说,直接忘记了在jsp里面的sql语句怎么正确书写了;经过查阅资料发现,查询语句是这样写的:Stringsql="select*frombookwhereid="+id;......
  • 拉格朗日反演公式(lagrange inversion)组合证明
    Thereisasimplecombinatorialproof.Theoriginalformis\[[t^n]w^k=\frac{k}{n}[t^{n-k}]\phi^k\]where\(w=t\phi(w)\)consider\(w\)asegf.ofthewaysofsometrees.\(\phi\)asageneratingruleconcerningdegree.\[n![x^n]\frac{w^k}{k......
  • 解决Could not find a version that satisfies the requirement思路
    安装python第三方库的时候会提示报错缺少依赖库,报错如下:ERROR:Couldnotfindaversionthatsatisfiestherequirement 模块名(fromautomat)(fromversions:none)ERROR:Nomatchingdistributionfoundfor模块名下图为有具体提示缺少的依赖库的版本信息: 下图则为......
  • Android Studio系列教程五--Gradle命令详解与导入第三方包
    AndroidStudio+Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看、编译并导入第三方开源项目的方法。Sublime+Terminal编译并查看源码首先来给大家介绍一种简便并且个人最喜欢的一种办法。很多时候我们在GitHub上看到一个不错的开......
  • 史上最详细的Android Studio系列教程四--Gradle基础
    什么是Gradle?Gradle是一种依赖管理工具,基于Groovy语言,面向Java应用为主,它抛弃了基于XML的各种繁琐配置,取而代之的是一种基于Groovy的内部领域特定(DSL)语言。安装Gradle在AndroidStudio系列教程一--下载与安装中新建项目成功后会下载Gradle,貌似这个过程不翻也是可以下载,但是访问......