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

如何解决跨Gradle项目导入本地KMM库的依赖解析问题(基于buildSrc)

KMM跨项目共享依赖定义解决方案

问题1:能否导入外部buildSrc的Kotlin文件?

不行。buildSrc是Gradle专为当前项目设计的特殊目录,它会被Gradle当作独立子项目编译,编译后的类仅对当前项目可见。Gradle的类加载机制限制了外部项目无法访问另一项目buildSrc生成的类,因此直接导入外部buildSrc的Kotlin文件来解析依赖不可行。

问题2:替代方案:跨项目共享依赖定义的可行方案

以下是经过验证的可行方案,按推荐优先级排序:

1. Gradle版本目录(Version Catalog)

这是Gradle 7.0+官方推荐的轻量级依赖共享方案,比buildSrc更灵活且易跨项目复用:

  • 将所有依赖版本和坐标定义在单独的libs.versions.toml文件中,存放至元项目和Android项目均可访问的位置(如同一Git仓库根目录、本地共享目录)。
  • 示例libs.versions.toml内容:
    [versions]
    kotlin = "1.9.20"
    kmm-coroutines = "1.7.3"
    
    [libraries]
    kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
    kmm-coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "kmm-coroutines" }
    
  • 在元项目和Android项目的settings.gradle.kts中引入该文件:
    dependencyResolutionManagement {
        versionCatalogs {
            create("libs") {
                from(files("../shared/libs.versions.toml")) // 根据实际路径调整
            }
        }
    }
    
  • 后续两个项目均可通过libs.kotlin.stdlib()、libs.kmm.coroutines.core()统一引用依赖,本地KMM库的依赖也能被正确解析。

2. 自定义Gradle插件

如果需要复杂的依赖逻辑(如动态版本计算、条件依赖),可将依赖定义封装为独立Gradle插件:

  • 创建单独的dependency-plugin模块,在插件中定义依赖版本和坐标的常量或扩展属性。
  • 示例插件核心代码:
    class SharedDependenciesPlugin : Plugin<Project> {
        override fun apply(project: Project) {
            project.extensions.create("sharedDeps", SharedDependenciesExtension::class.java)
        }
    }
    
    open class SharedDependenciesExtension {
        val kotlinVersion = "1.9.20"
        val coroutinesVersion = "1.7.3"
        
        val kotlinStdlib get() = "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
        val coroutinesCore get() = "org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutinesVersion"
    }
    
  • 将插件发布到本地Maven仓库或内部私有仓库,元项目和Android项目引入插件后,即可通过sharedDeps扩展访问依赖定义。

3. 复合构建(Composite Build)

若元项目和Android项目在同一本地目录结构下,可通过复合构建共享依赖定义:

  • 创建shared-deps目录,将Dependencies.kt放入其中,配置该目录为Java/Kotlin库项目。
  • 在两个项目的settings.gradle.kts中引入共享项目:
    includeBuild("../shared-deps")
    
  • 之后两个项目均可依赖该共享库,直接使用其中定义的依赖常量。

内容的提问来源于stack exchange,提问作者Sean Blahovici

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:55:11