使用 Gradle 版本目录管理 Android 项目中的库和依赖项


在大型多模块 Android(或任何基于 gradle 的)项目中,版本管理开始变得有点痛苦。

人们处理这个问题的最常见方式是使用 buildSrc,但这样做的问题是buildSrc更改会导致整个构建过程中的缓存失效并增加构建时间。

显然现在呼吁采取行动从 buildSrc 转移到 includeBuild

如果您有其他自定义构建逻辑和构建插件,那么转移到该机制当然是有意义的includeBuild,但是如果您buildSrc只需要对依赖项进行版本管理,那么还有一个更好的方法 - gradle 版本目录

将版本和库添加到settings.gradle(.kts)

注意:我所有的示例都在 kts 中,因为 kotlin 中的构建脚本具有更好的 DX(自动完成、linting 等)

例如,这是我添加的内容settings.gradle.kts(之后在行上扩展)

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

    versionCatalogs {
        create("libs") {
            version("androidx.navigation", "2.4.1")
            version("android.material", "1.7.0-alpha01")
            version("moshi", "1.13.0")
            version("retrofit", "2.9.0")
            version("moshi", "1.13.0")

            library("android.material", "com.google.android.material", "material").versionRef("android.material")
            library("androidx.navigation.fragment", "androidx.navigation", "navigation-fragment-ktx").versionRef("androidx.navigation")
            library("androidx.navigation.ui", "androidx.navigation", "navigation-ui-ktx").versionRef("androidx.navigation")
            library("androidx.core", "androidx.core:core-ktx:1.7.0")
            library("androidx.appcompat", "androidx.appcompat:appcompat:1.4.1")
            library("okhttp", "com.squareup.okhttp3:okhttp:5.0.0-alpha.6")
            library("retrofit", "com.squareup.retrofit2", "retrofit").versionRef("retrofit")
            library("retrofit.converter.moshi", "com.squareup.retrofit2", "converter-moshi").versionRef("retrofit")
            library("moshi", "com.squareup.moshi", "moshi-kotlin").versionRef("moshi")
            library("moshi.compiler", "com.squareup.moshi", "moshi-kotlin-codegen").versionRef("moshi")

            bundle("androidx.appcompat", listOf("androidx.core", "androidx.appcompat"))
            bundle("androidx.navigation", listOf("androidx.navigation.fragment", "androidx.navigation.ui"))
            bundle("retrofit", listOf("retrofit", "retrofit.converter.moshi"))
        }
    }
}
  1. 创建“库”块
dependencyResolutionManagement {
  versionCatalogs {
    create("libs") {...}
  }
}

2.添加版本常量

version("android.material", "1.7.0-alpha01")
version("moshi", "1.13.0")
version("retrofit", "2.9.0")

3.添加每个依赖
您可以通过引用版本常量versionRef()

library("android.material", "com.google.android.material", "material").versionRef("android.material")
  1. 如果有一组库一起使用,则创建“捆绑包”
bundle("androidx.appcompat", listOf("androidx.core", "androidx.appcompat"))

build.gradle(.kts)在文件中使用版本目录库
在模块的 build.gradle 中使用这些的方法如下

dependencies {

    implementation(libs.bundles.androidx.appcompat)
    implementation(libs.android.material)
    implementation("androidx.constraintlayout:constraintlayout:2.1.3")
    implementation(libs.bundles.androidx.navigation)
    testImplementation("junit:junit:4.13.2")
    androidTestImplementation("androidx.test.ext:junit:1.1.3")
    androidTestImplementation("androidx.test.espresso:espresso-core:3.4.0")
}

普通库是这样使用的

  implementation(libs.android.material)

虽然可以像这样添加整个捆绑包

  implementation(libs.android.material)

什么不起作用?
有一些注意事项

Gradle 7.4+

如果您使用的是 Gradle 7.3 或更低版本,则版本目录是不稳定/实验性 API,您需要将其标记为。从 7.4 开始,它们默认启用

Android Studio 对版本管理的支持

版本目录中的依赖项不会显示在Android Studio 的项目结构选项中,工作室也不会提醒您更新过时的依赖项。

正如您在下面看到的,有一个关于版本目录的警告,并且版本目录依赖项没有显示出来

自动完成仅适用于 Kotlin

如果您使用build.gradle(groovy) 而不是build.gradle.kts(kotlinscript),则libs.x.y依赖项将没有自动完成或类型检查

以下是仅在.kts文件内部工作的自动完成功能。

猜你喜欢

转载自blog.csdn.net/Misdirection_XG/article/details/126661210#comments_25797981
今日推荐