赞
踩
在大型多模块 Android(或任何基于 gradle 的)项目中,版本管理开始变得有点痛苦。
人们处理这个问题的最常见方式是使用 buildSrc,但这样做的问题是buildSrc更改会导致整个构建过程中的缓存失效并增加构建时间。
显然现在呼吁采取行动从 buildSrc 转移到 includeBuild
如果您有其他自定义构建逻辑和构建插件,那么转移到该机制当然是有意义的includeBuild,但是如果您buildSrc只需要对依赖项进行版本管理,那么还有一个更好的方法 - gradle 版本目录
注意:我所有的示例都在 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")) } } }
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")
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.3 或更低版本,则版本目录是不稳定/实验性 API,您需要将其标记为。从 7.4 开始,它们默认启用
版本目录中的依赖项不会显示在Android Studio 的项目结构选项中,工作室也不会提醒您更新过时的依赖项。
正如您在下面看到的,有一个关于版本目录的警告,并且版本目录依赖项没有显示出来
如果您使用build.gradle(groovy) 而不是build.gradle.kts(kotlinscript),则libs.x.y依赖项将没有自动完成或类型检查
以下是仅在.kts文件内部工作的自动完成功能。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。