如何在Gradle Kotlin扩展中访问Android项目的版本库libs?
解决buildSrc中无法访问Gradle版本目录(libs)的问题
问题场景
多个feature模块的build.gradle.kts中重复配置Jetpack Compose依赖,想通过buildSrc编写compose()扩展方法简化依赖声明,但在扩展方法中使用libs(版本目录)时出现Unresolved reference: libs错误——主项目模块能正常访问libs,但buildSrc中的代码无法识别。
原因
buildSrc是独立的Gradle子项目,默认不会自动加载主项目的版本目录(libs.versions.toml),因此无法生成对应的libs扩展类供buildSrc代码调用。
解决方案
方法1:让buildSrc加载根项目的版本目录(推荐)
通过配置buildSrc的配置文件,让它能够访问根项目的版本目录,从而正常生成并使用libs扩展:
- 在buildSrc目录下创建
settings.gradle.kts文件,内容如下:
dependencyResolutionManagement { versionCatalogs { create("libs") { from(files("../libs.versions.toml")) } } }
- 修改buildSrc目录下的
build.gradle.kts,确保启用kotlin-dsl插件并配置必要仓库:
plugins { `kotlin-dsl` } repositories { google() mavenCentral() } dependencies { implementation(gradleApi()) implementation(kotlin("stdlib")) }
- 保持你的
compose()扩展方法不变,此时libs就能被正常识别:
fun DependencyHandler.compose() { add("implementation", platform(libs.composeBom)) add("implementation", libs.ui) add("implementation", libs.uiGraphics) add("implementation", libs.uiToolingPreview) add("implementation", libs.viewModelKtx) add("implementation", libs.lifecycleRuntimeCompose) add("implementation", libs.hiltNavigationCompose) add("implementation", libs.material3) add("debugImplementation", libs.uiTooling) add("debugImplementation", libs.uiTestManifest) }
方法2:手动传递VersionCatalog参数(备选)
如果不想修改buildSrc的配置,可以将libs作为参数传递给扩展方法:
- 修改扩展方法,接收
VersionCatalog参数:
import org.gradle.api.artifacts.VersionCatalog fun DependencyHandler.compose(libs: VersionCatalog) { add("implementation", platform(libs.findLibrary("composeBom").get())) add("implementation", libs.findLibrary("ui").get()) add("implementation", libs.findLibrary("uiGraphics").get()) add("implementation", libs.findLibrary("uiToolingPreview").get()) add("implementation", libs.findLibrary("viewModelKtx").get()) add("implementation", libs.findLibrary("lifecycleRuntimeCompose").get()) add("implementation", libs.findLibrary("hiltNavigationCompose").get()) add("implementation", libs.findLibrary("material3").get()) add("debugImplementation", libs.findLibrary("uiTooling").get()) add("debugImplementation", libs.findLibrary("uiTestManifest").get()) }
- 在模块的
build.gradle.kts中调用时传入libs:
dependencies { // 其他依赖... compose(libs) }
这种方法无需修改buildSrc配置,但调用时需要多传一个参数,不如方法1简洁。
内容的提问来源于stack exchange,提问作者Pierre Vieira
相关产品推荐
相关产品推荐

