如何解决跨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
相关产品推荐
相关产品推荐

