【Android】 Version Catalog统一版本管理之Groovy篇

2023-11-19

Gradle7.0.0以上依赖库统一版本号管理

Gradle7.0推出了一个新的特性,使用Catalog统一依赖版本,它支持以下特性:

1、对所有module可见,可统一管理所有module的依赖。

2、支持声明依赖bundles,即总是一起使用的依赖可以组合在一起。

3、支持版本号与依赖名分离,可以在多个依赖间共享版本号。

4、支持在单独的libs.versions.toml文件中配置依赖。

5、支持在项目间共享依赖。

Kotlin 和 Groovy 语言差异

一些简单的 Kotlin 和 Groovy 语言差异可能会使转换脚本变得乏味:

  • Groovy 字符串可以用单引号'string'或双引号引起来,"string"而 Kotlin 需要双引号"string"

  • Groovy 允许在调用函数时省略括号,而 Kotlin 总是需要括号。

  • Gradle Groovy DSL 允许=在分配属性时省略赋值运算符,而 Kotlin 始终需要赋值运算符。

 这里作简单说明,是因为之前配置时kotlin与groovy的配置混用,导致配置不成功。

使用Version Catalog

注意,Catalog仍然是一个孵化中的特性,如需使用,需要在settings.gradle中添加以下内容:

enableFeaturePreview('VERSION_CATALOGS')

从命名上也可以看出,Version Catalog其实就是一个版本的目录,我们可以从目录中选出我们需要的依赖使用。

dependencies {
    ...
    // 小括号可有可无,如下
    implementation(libs.retrofit)
    implementation libs.groovy.core
    ...
}

在这种情况下,libs是一个目录,retrofit表示该目录中可用的依赖项。使用Version Catalog具有许多优点:

1、对于每个catalog,Gradle都会生成类型安全的访问器,以便你在IDE中可以自动补全。(注:目前在build.gradle中还不能自动补全,可能是指kts或者开发中?)

2、声明在catalog中的依赖对所有module可见,当修改版本号时,可以统一管理统一修改。

3、catalog支持声明一个依赖bundles,即一些总是一起使用的依赖的组合。

4、catalog支持版本号与依赖名分离,可以在多个依赖间共享版本号。

声明Version Catalog 

Version Catalog可以在settings.gradle(.kts)文件中声明。

别名必须由一系列以破折号(-,推荐)、下划线 (_) 或点 (.) 分隔的标识符组成。

标识符本身必须由ascii字符组成,最好是小写,最后是数字。

值得注意的是,groovy-core会被映射成libs.groovy.core。

如果想避免映射可以使用大小写来区分,比如groovyCore会被处理成libs.groovyCore。

dependencyResolutionManagement {
//gradle 有一个默认配置名称为 libs,如果你创建的版本目录名称是 libs,那么你就无需通过 from 方法加载 libs.versions.toml 文件,因为 gradle 会默认此配置,你只需在 ./gradle 路径下创建 libs.versions.toml 文件即可,重复添加会导致编译失败;
    // 版本目录配置
    versionCatalogs {
        // 创建一个名称为 libs 的版本目录
        libs {
            // groovy单、双引号皆可,kotlin只能双引号,建议都用双引号
            version("minSdk","24")
            version('compileSdk','30')
            version('targetSdk','30')

            // 声明 groovy 版本
            version("groovy", "3.0.5")
            // 声明 groovy 依赖
            alias("groovy-core").to("org.codehaus.groovy", "groovy").versionRef("groovy")
            // 声明 groovy 依赖
            alias("groovy-nio").to("org.codehaus.groovy", "groovy-nio").versionRef("groovy")
            // 声明 groovy 依赖使用版本引用
            alias("groovy-json").to("org.codehaus.groovy", "groovy-json").versionRef("groovy")
            // 多版本约束,strictly可不换行,prefer必须换行,否则编译不通过
            alias("commons-lang3").to("org.apache.commons","commons-lang3").version{ strictly'[3.8,4.0['
                prefer'3.9'}

            // 依赖bundles 声明 groovy 依赖组,三个groovy依赖具有相同的版本号,可以把它们统一起来
            bundle("groovy", ["groovy-core", "groovy-json", "groovy-nio"])

            //插件版本
            alias('jmh').toPluginId('me.champeau.jmh').version('0.6.5')
        
            // Catalog支持通过从Toml文件引入依赖;
            // libs.version.toml 放到gradle目录下会自动加载,一是不能在libs的版本目录下引入,可以定义其它目录引入;二是versions定义可以直接使用不需要引入;
            //from(files("./gradle/libs.versions.toml"))
  
        }
        // 创建一个新的版本目录,可以引入任何toml文件,包括gradle下的libs.version.toml
        testLib{
           from(files("./gradle/libs.versions.toml"))
        }
    }
}

 使用Version Catalog

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    // Use the plugin `jmh` as declared in the `libs` version catalog
    //alias(libs.plugins.jmh)
}
android {
    compileSdk libs.versions.compileSdkVersion.get().toInteger()

    defaultConfig {
        applicationId "com.hollysys.mengniumeishang"
        minSdk libs.versions.minSdkVersion.get().toInteger()
        targetSdk libs.versions.targetSdkVersion.get().toInteger()
        versionCode 1
        versionName "1.2"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    ...
}
dependencies {
    implementation libs.bundles.groovy
    ...
}

单独文件中配置Version Catalog

除了在settings.gradle中声明Catalog外,也可以通过一个单独的文件来配置Catalog。

如果在根构建的gradle目录中找到了libs.versions.toml文件,则将使用该文件的内容自动声明一个Catalog。

TOML文件主要由4个部分组成:

[versions] 部分用于声明可以被依赖项引用的版本。

[libraries]部分用于声明Library的别名。

[bundles]部分用于声明依赖包。

[plugins] 部分用于声明插件。

如定义libs.version.toml文件内容如下:

[versions]
groovy = "3.0.5"
checkstyle = "8.37"
common = "1.4"
compileSdkVersion = '32'
minSdkVersion = "21"
targetSdkVersion = "32"
# versions可以定义成一个字符串,也可以定义成一个范围,详情可参见rich-version
my-lib = { strictly ="[1.0, 2.0[", prefer ="1.2"}
[libraries]
retrofit ="com.squareup.retrofit2:retrofit:2.9.0"
my-lib = "com.mycompany:mylib:1.4"
my-other-lib = { module = "com.mycompany:other", version = "1.4" }
my-other-lib2 = { group = "com.mycompany", name = "alternate", version = "1.4" }
mylib-full-format = { group = "com.mycompany", name = "alternate", version = { require = "1.4" } }
groovy-core = { module = "org.codehaus.groovy:groovy", version.ref = "groovy" }
groovy-json = { module = "org.codehaus.groovy:groovy-json", version.ref = "groovy" }
groovy-nio = { module = "org.codehaus.groovy:groovy-nio", version.ref = "groovy" }
commons-lang3 = { group = "org.apache.commons", name = "commons-lang3", version = { strictly = "[3.8, 4.0[", prefer="3.9" } }

[bundles]
groovy = ["groovy-core", "groovy-json", "groovy-nio"]

[plugins]
jmh = { id = "me.champeau.jmh", version = "0.6.5" }
short-notation = "some.plugin.id:1.4"
long-notation = { id = "some.plugin.id", version = "1.4" }
reference-notation = { id = "some.plugin.id", version.ref = "common" }

如上所示,依赖可以定义成一个字符串,也可以将module与version分离开来。

其中versions可以定义成一个字符串,也可以定义成一个范围,详情可参见rich-version。

[versions]
my-lib = { strictly ="[1.0, 2.0[", prefer ="1.2"}

在项目间共享Version Catalog

Toml文件共享

dependencyResolutionManagement {
    versionCatalogs {
        libs {
            from(files("./libs.versions.toml"))
        }
        // 声明一个'testLibs'目录, 从'test-libs.versions.toml'文件中
        testLibs {
            from(files('./gradle/test-libs.versions.toml'))
        }
    }
}

发布插件共享

通过Catalog插件来发布目录,用户直接引入这个插件即可。

Gradle提供了一个Catalog插件,它提供了声明然后发布Catalog的能力。

1. 首先引入两个插件

plugins {
 id 'version-catalog'
 id 'maven-publish'
}

然后,此插件将公开可用于声明目录的catalog扩展。

2. 定义目录

使用catalog扩展定义目录。

catalog {
    // 定义目录
    versionCatalog {
        from files('../libs.versions.toml')
    }
}

3. 发布目录

publishing {
    publications {
        maven(MavenPublication) {
             groupId ='com.zj.catalog'
             artifactId ='catalog'
             version ='1.0.0'
             from components.versionCatalog
        }
    }
}

4. 使用目录

# settings.gradle

dependencyResolutionManagement {
    //...
    repositories {
        mavenLocal()
        //...
    }
}
enableFeaturePreview('VERSION_CATALOGS')
dependencyResolutionManagement {
    versionCatalogs {
        libs {
            from("com.xx.catalog:catalog:1.0.0")
            // 我们也可以重写覆盖catalog中的groovy版本
            version("groovy","3.0.6")
        }
    }
}

 

补充说明

1、经测试发现gradle 7.1.1版本不支持toml中定义的 [plugins] , 但支持 [metadata]。将gradle改为 7.3.3就支持 [plugins]。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Android】 Version Catalog统一版本管理之Groovy篇 的相关文章

随机推荐

  • vue封装年月日时分秒

  • case when then else_CASE 表达式

    一 语法及作用 使用CASE表达式可以帮助我们解决复杂的查询问题 相当于条件判断的函数 判断每一行是不是满足条件 CASE CASE 表达式会从对最初的WHEN子句中的 lt 求值表达式 gt 进行求值开始执行 所谓求值 就是要调查该表达式
  • STM32CubeIDE使用笔记(01):基础说明与开发流程

    文章目录 目的 基础事项 下载安装 界面说明 项目文件夹 常用快捷键 开发流程 总结 目的 STM32cubeIDE是ST官方推出的一款用于开发STM32的工具 其实就是整合了STM32CubeMX和TrueSTUDIO而成 对于STM32
  • C、C++、C#、python、java编程—数据类型的使用(二)

    四 Python 4 1字符串 1 字符串使用 var1 Hello World var2 Python Runoob print var1 0 var1 0 print var2 1 5 var2 1 5 以上实例执行结果 var1 0
  • 文本同文件一并提交的后端接口处理(一个实体类)

    出现的问题 org springframework web HttpMediaTypeNotSupportedException Content type multipart form data boundary WebKitFormBou
  • jupyter基本使用方法

    jupyter基本使用方法 菜单栏 File Edit View Insert Cell Kernel Help 工具条 单元 快捷键 菜单栏 File Edit View Insert Cell Kernel Help 工具条 单元 在M
  • 图书管理系统数据字典_2. 结构化——数据字典

    返回目录 Chilan Yuk 软件工程分析设计图库目录 zhuanlan zhihu com 一 基本知识 用于定义数据流和数据存储的结构 并给出构成所给的数据流和数据存储的各数据项的基本数据类型 数据字典中应该包括关于数据的如下信息 一
  • BUCK电路分析(二)

    BUCK电路分析 二 PSIM仿真同步BUCK电路 在上片文章中 初步的分析了BUCK电路的工作原理 本章使用PSIM软件仿真BUCK电路 观察分析BUCK电路器件关键波形 图1是同步BUCK电路图 开关频率设置为200K 固定占空比 在仿
  • Game101现代计算机图形学作业1

    Game101现代计算机图形学作业1 一 作业描述 二 解决方法 一 模型变换 二 投影变换 绕任意轴旋转 三 总结 四 参考和引用 一 作业描述 给定三维下三个点 v 0 2 0 0
  • esp32固件下载时有关串口通信的问题

    最近我做了个简易的esp32开发板 用arduino写了点程序 却怎么也传不上去 用arduino上传的时候总是显示 A fatal error occurred Failed to connect to ESP32 No serial d
  • 启用Powershell脚本(因为在此系统上禁止运行脚本)

    以管理员身份运行一个Powershell窗口 get executionpolicy Restricted set executionpolicy remotesigned Y get executionpolicy RemoteSigne
  • c++基于gSoap开发编译异常

    在程序中存在多个gSoap客户端代理类的话 比如我项目中用到的两个NMMAILGgzwSerSoapProxy h和ZJFaxMangerHttpBindingProxy h 其中第一个NMMAILGgzwSerSoapProxy h类是后
  • 解决 pip install requirements.txt 失败问题

    将命令改为 pip install r requirements txt
  • vscode中jupyter控制是否完整输出,是否折叠。

    打开一个笔记本 右上角设置 自定义笔记本布局 设置output scrolling 设置后 重启vscode生效
  • jwt的token自动续约_JWT的TOKEN续期功能

    JWT里有一个关键的东东 就是续期TOKEN 即TOKEN快过期时 刷新一个新的TOKEN给客户端 办法如下 1 后端生成TOKEN import com starmark core shiro model SecurityUser imp
  • 抖音视频怎么制作

    1 抖音拍摄制作 抖音短视频作为一款视频拍摄 分享软件 自身也带有一些功能可以实现抖音视频制作 做出的抖音视频也很好玩 步骤 1 首先安装好抖音并打开软件 点击软件正下方的 2 可以点击 视频 自动拍摄一段视频 或者点击 上传 将已经拍摄好
  • 如何在命令行中显示五彩斑斓的“黑”

    1 前言 大部分 coder 已经习惯了命令行枯燥的黑底白字 而且任何编程语言入门的第一行代码都是教我们如何在标准输出 大部分情况就是命令行终端或控制台 打印一行 非黑即白 的 hello world 以至于很多不懂编程的 大佬 都觉得程序
  • 2012_11月总结分享

    11月份下旬 我在技术上主要看了看spring的IoC容器实现相关的内容 但是这次来不及写了 这是一个很长的故事 就分享了一下11月份遇到的值得记录的东西吧 中间也穿插2篇文章分享 无缝对接 总结如下 1 代码规范问题 2 Tair批量读取
  • shell调用函数

    echo ACCEPT DATE F RETURN DATE ACCEPT DATE gt gt FILENAME
  • 【Android】 Version Catalog统一版本管理之Groovy篇

    Gradle7 0 0以上依赖库统一版本号管理 Gradle7 0推出了一个新的特性 使用Catalog统一依赖版本 它支持以下特性 1 对所有module可见 可统一管理所有module的依赖 2 支持声明依赖bundles 即总是一起使