Gradle版本目录(Version Catalog)

news/2024/5/20 3:05:49 标签: gradle

Gradle版本目录(Version Catalog)

“版本目录是一份依赖项列表,以依赖坐标表示,用户在构建脚本中声明依赖项时可以从中选择。”

我们可以使用版本目录将所有依赖项声明及其版本号保存在单个位置。这样,我们可以轻松地在模块和项目之间共享依赖项和版本配置列表。

有了IDE插件支持,将依赖项导入到我们的项目中会更容易,因为它提供了基于我们在版本目录中定义的内容的自动完成功能。

最好的方式是创建一个TOML(Tom’s Obvious Minimal Language)文件作为其可移植性。请注意,此TOML文件不是唯一的真相来源,因为我们始终可以在脚本的不同位置硬编码其他依赖项和版本,而IDE不会强制将所有内容保存在版本目录中。

创建版本目录只需要几个步骤。大部分的工作将花在准备TOML文件上,这取决于我们在项目中所拥有的依赖项。

启用版本目录(Version catalog)

gradle 7.4 版本中的版本编目是稳定的,当使用 7.4+ 版本时,此步骤不是必需的。

升级 Gradle
运行./gradlew wrapper --gradle-version=7.6以将项目更新到 7.6 版本。

在旧版 Gradle 上使用 enableFeaturePreview
请注意,在 Gradle 8.0+ 上不再需要 enableFeaturePreview

settings.gradlesettings.gradle.kts 中进行更改:

Kotlin DSL

enableFeaturePreview("VERSION_CATALOGS")
include(":app")

Groovy

enableFeaturePreview("VERSION_CATALOGS")
include ':app'

获取版本目录(Version catalog)

同样的语法,再次将其添加到相同的settings.gradlesettings.gradle.kts中。

dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
        google()
        mavenCentral()
    }
}

在这里插入图片描述

libs.versions.toml 文件中声明依赖项

  • 创建gradle/libs.versions.toml文件
  • 值得注意的是,要检查您的 .gitignore 文件是否忽略了 /gradle/ 目录,以便您的版本库会保留lib.versions.toml文件。
  • Android Studio 应该已经捆绑了 Toml 插件;对于 IntelliJ IDEA,您可以双重检查以确保您已经为扩展 IDE 支持安装了该插件。

我的样例libs.versions.toml文件
是一个早期版本,需要继续完善。请注意,文件中包含以下四个部分:

  • versions
  • libraries
  • plugins
  • bundles

同时需要注意的是,如果名称中有“-”,在Gradle构建脚本中引用时必须将其改成“.”。例如,如果我们定义了hilt-android,那么在调用时它将变成libs.hilt.android

[versions]
# Define the dependency versions
minSdk = "26"
targetSdk = "33"
compileSdk = "33"

accompanist = "0.27.0"
androidx-activity-compose = "1.6.1"
androidx-compose-bom = "2022.11.00"
androidx-core-ktx = "1.9.0"
androidx-lifecycle-runtime-compose = "2.6.0-alpha03"
androidx-navigation-compose = "2.5.3"
coil = "2.2.2"
compose-compiler = "1.3.2"
coroutines = "1.6.4"
espresso = "3.5.0"
gradle-plugin = "7.2.2"
androidBuildTools = "7.2.2"
hilt = "2.44.1"
hilt-navigation-compose = "1.0.0"
junit = "4.13.2"
kotest = "5.5.4"
kotlin = "1.7.20"
kotlinx-serialization-json = "1.4.1"
kover = "0.5.0"
ktlint = "11.0.0"
ktlint-plugin = "7.1.0"
ktor = "2.1.3"
leakcanary = "2.10"
mockk = "1.13.2"
room = "2.4.3"
test-rules = "1.5.0"
text-ext = "1.1.4"
timber = "5.0.1"

[libraries]
kotlin-gradlePlugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" }
android-gradlePlugin = { module = "com.android.tools.build:gradle", version.ref = "androidBuildTools"}

androidx-core-ktx = { module = "androidx.core:core-ktx", version.ref = "androidx-core-ktx" }
androidx-lifecycle-runtime-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "androidx-lifecycle-runtime-compose" }
androidx-activity-compose = { module = "androidx.activity:activity-compose", version.ref = "androidx-activity-compose" }
androidx-navigation-compose = { module = "androidx.navigation:navigation-compose", version.ref = "androidx-navigation-compose" }

androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } # kapt
androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
androidx-room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }
androidx-room-testing = { module = "androidx.room:room-testing", version.ref = "room" }

junit = { module = "junit:junit", version.ref = "junit" }
androidx-test-junit4 = { module = "androidx.test.ext:junit", version.ref = "text-ext" }
androidx-test-rules = { module = "androidx.test:rules", version.ref = "test-rules" }
androidx-test-espresso-core = { module = "androidx.test.espresso:espresso-core", version.ref = "espresso" }
androidx-test-espresso-idling-resource = { module = "androidx.test.espresso:espresso-idling-resource", version.ref = "espresso" }

androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "androidx-compose-bom" }
androidx-compose-material = { module = "androidx.compose.material:material" }
androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" }
androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" }
androidx-compose-ui-test-junit4 = { module = "androidx.compose.ui:ui-test-junit4" }
androidx-compose-ui-test-manifest = { module = "androidx.compose.ui:ui-test-manifest" }

timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" }

coil-kt = { module = "io.coil-kt:coil", version.ref = "coil" }
coil-kt-compose = { module = "io.coil-kt:coil-compose", version.ref = "coil" }

kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }

kotlinx-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
kotlinx-coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "kotlinx-serialization-json" }

kotest-runner-junit5 = { module = "io.kotest:kotest-runner-junit5", version.ref = "kotest" }
kotest-assertions-core = { module = "io.kotest:kotest-assertions-core", version.ref = "kotest" }
kotest-property = { module = "io.kotest:kotest-property", version.ref = "kotest" }

ktor-client-android = { module = "io.ktor:ktor-client-android", version.ref = "ktor" }
ktor-client-serialization = { module = "io.ktor:ktor-client-serialization", version.ref = "ktor" }
ktor-client-cio = { module = "io.ktor:ktor-client-cio", version.ref = "ktor" }
ktor-client-content-negotiation = { module = "io.ktor:ktor-client-content-negotiation", version.ref = "ktor" }
ktor-client-logging-jvm = { module = "io.ktor:ktor-client-logging-jvm", version.ref = "ktor" }
ktor-serialization-kotlinx-json = { module = "io.ktor:ktor-serialization-kotlinx-json", version.ref = "ktor" }
ktor-client-mock = { module = "io.ktor:ktor-client-mock", version.ref = "ktor" }

hilt-android = { module = "com.google.dagger:hilt-android", version.ref = "hilt" }
hilt-compiler = { module = "com.google.dagger:hilt-compiler", version.ref = "hilt" }
hilt-navigation-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hilt-navigation-compose" }
hilt-android-compiler = { module = "com.google.dagger:hilt-android-compiler", version.ref = "hilt" }
hilt-android-testing = { module = "com.google.dagger:hilt-android-testing", version.ref = "hilt" }

mockk = { module = "io.mockk:mockk", version.ref = "mockk" }
mockk-agent-jvm = { module = "io.mockk:mockk-agent-jvm", version.ref = "mockk" }
mockk-android = { module = "io.mockk:mockk-android", version.ref = "mockk" }
accompanist-webview = { module = "com.google.accompanist:accompanist-webview", version.ref = "accompanist" }
accompanist-swiperefresh = { module = "com.google.accompanist:accompanist-swiperefresh", version.ref = "accompanist" }
leakcanary-android = { module = "com.squareup.leakcanary:leakcanary-android", version.ref = "leakcanary" }
ktlint-gradle = { module = "org.jlleitschuh.gradle:ktlint-gradle", version.ref = "ktlint" }

[bundles]
# Define bundles/groups of libraries
coil = ["coil-kt", "coil-kt-compose"]
room = ["androidx-room-ktx", "androidx-room-runtime"]
kotest = ["kotest-runner-junit5", "kotest-assertions-core", "kotest-property"]
ktor = ["ktor-client-android", "ktor-client-serialization", "ktor-client-cio", "ktor-client-content-negotiation", "ktor-client-logging-jvm", "ktor-serialization-kotlinx-json"]
coroutines = ["kotlinx-coroutines-core", "kotlinx-coroutines-android"]

[plugins]
# android-application = { id = "com.android.application", version.ref = "gradle-plugin" }
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
hilt-android-plugin = { id = "com.google.dagger.hilt.android", version.ref = "hilt" }
kover-plugin = { id = "org.jetbrains.kotlinx.kover", version.ref = "kover" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" }
android-library = { id = "com.android.library", version.ref = "gradle-plugin" }
ktlint = { id = "org.jlleitschuh.gradle.ktlint", version.ref = "ktlint-plugin" }

更新依赖

// change from
    implementation 'com.google.dagger:hilt-android:2.43.2'
    kapt 'com.google.dagger:hilt-compiler:2.43.2'

// change to
    implementation libs.hilt.android
    kapt libs.hilt.complier

扩展用法

我们还可以将minSdk和targetSdk移动到版本目录中。

Groovy

https://docs.gradle.org/7.0/userguide/platforms.html#sub:central-declaration-of-dependencies
https://proandroiddev.com/gradle-version-catalogs-for-an-awesome-dependency-management-f2ba700ff894
https://umang91.medium.com/integrating-a-version-catalog-c5c7d45516db


http://www.niftyadmin.cn/n/429777.html

相关文章

加密相关名词整理

加密相关名词 散列函数SSL/TLSHTTPS 证书对称密钥非对称密钥数字签名BER, Basic Encoding Rules 基本编码规则DER,Distinguished Encoding Rules 可分辨编码规则PEMANSI (American National Standards Institute)ASN.1 Abstract Syntax Notation One&…

2023北京健康产业展会,2023北京养生健康展,艾草艾灸展

China-DJK北京健博会|2023年度下半年,北京唯有的健康产业盛会; 大会简介:中国(北京)国际大健康产业博览会China (Beijing) International Health Service Expo,简称:China-DJK北京健博会&#…

App 启动速度优化

前言​​​​​​​ APP打开的一瞬间速度快慢;就好比人的第一印象,快速的打开一个应用往往给人很舒服的体验。app经常性卡顿启动速度很慢,这无疑是对用户的流失。 启动方式介绍 APP启动的方式分为3种:冷启动、热启动、温启动。…

精通postman教程(一)下载及安装详解

作为一名测试工程师,那么Postman绝对是大伙必备的工具之一。 在这个系列教程中,我将为大伙详细讲解如何使用Postman进行API测试。 今天我将先为大伙介绍Postman的下载安装方法,让你们快速上手这款工具。 一、下载 下载地址:Do…

SpringBatch从入门到实战(三):多步骤控制

一:if else案例 案例:如果开始步骤成功了就执行成功步骤,否则执行失败步骤。 // 伪代码 String exitStatus helloWorldJob(); if("FAILED".equals(exitStatus)){failStep(); }else{successStep(); }Configuration public class …

Linux基本工具

文章目录 Linux软件包管理器yum关于rzsz安装与卸载示例注意事项 Linux开发工具vimvim基本操作总结插入模式:移动光标快捷键删除文字复制替换撤销上一次操作更改跳至指定的行多文件操作底行模式 sudoLinux编译器gcc/g的使用预处理编译汇编链接生成可执行文件总结详谈…

介绍几种最常见的加密和解密方法

加密与解密是通信中最常用的数据转换手段,加密的基本过程是应用加密算法与密钥对明文(尚未加密的原文)实施加密,转换成密文发送;解密的基本过程是接收到密文后,应用相应算法与同一密钥对密文解密&#xff0…

测试工程师常见的面试问题及回答建议

说起软件测试近几年的发展,其实已悄无声息地发生了巨大的变化。前几年随着互联网行业的迅猛发展,软件测试人才稀缺,低门槛高薪资促使大批毕业生和转行人员一窝蜂地涌入。而现在,软件测试发展太快,纵观各大招聘网站&…