You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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扩展:

  1. 在buildSrc目录下创建settings.gradle.kts文件,内容如下:
dependencyResolutionManagement {
    versionCatalogs {
        create("libs") {
            from(files("../libs.versions.toml"))
        }
    }
}
  1. 修改buildSrc目录下的build.gradle.kts,确保启用kotlin-dsl插件并配置必要仓库:
plugins {
    `kotlin-dsl`
}

repositories {
    google()
    mavenCentral()
}

dependencies {
    implementation(gradleApi())
    implementation(kotlin("stdlib"))
}
  1. 保持你的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作为参数传递给扩展方法:

  1. 修改扩展方法,接收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())
}
  1. 在模块的build.gradle.kts中调用时传入libs:
dependencies {
    // 其他依赖...
    compose(libs)
}

这种方法无需修改buildSrc配置,但调用时需要多传一个参数,不如方法1简洁。

内容的提问来源于stack exchange,提问作者Pierre Vieira

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 05:50:26