如何在Gradle Kotlin DSL中实现依赖库声明的复用?
解决方案
针对跨项目共享带复杂排除规则的依赖、同时保留Kotlin DSL类型安全的需求,大型项目普遍采用以下两种落地方案:
方案1:使用 buildSrc 共享构建逻辑(优先推荐)
buildSrc 是 Gradle 官方支持的全局构建逻辑共享目录,里面定义的Kotlin类会自动加入所有构建脚本的类路径,不会出现类找不到的问题,同时支持完整的类型检查和IDE补全。
配置步骤
- 在仓库根目录新建
buildSrc文件夹,创建buildSrc/build.gradle.kts配置文件:
plugins { `kotlin-dsl` } repositories { mavenCentral() }
- 创建
buildSrc/src/main/kotlin/Libraries.kt文件,定义所有带排除规则的依赖:
import org.gradle.api.artifacts.dsl.DependencyHandler class Libraries(dependencies: DependencyHandler) { val guava = dependencies.create("com.google.guava:guava:31.1-jre") { // 可添加任意数量的exclude规则 exclude(group = "com.google.guava", module = "listenablefuture") } // 其余100+依赖按相同格式定义即可 } // 定义全局扩展属性,无需额外初始化即可调用 val DependencyHandler.libraries get() = Libraries(this)
- 所有子项目的
build.gradle.kts中直接使用即可,无需额外导入或应用脚本:
dependencies { implementation(libraries.guava) }
该方案完美兼容 Gradle 6.9.1 及以上版本,符合你原有 libraries.blah 的使用习惯,同时保留完整的类型安全性。
方案2:基于Extra属性的兼容方案(无需改动目录结构)
如果暂时不想引入buildSrc,可通过弱化类型的方式规避跨脚本类无法导出的问题:
- 在
shared/gradle/dependencies.gradle.kts中定义依赖Map并写入Extra:
val libraries = mapOf( "guava" to dependencies.create("com.google.guava:guava:31.1-jre") { exclude(group = "com.google.guava", module = "listenablefuture") } // 其余依赖按格式添加 ) project.extra.set("libraries", libraries)
- 在应用了该脚本的项目中直接读取使用:
val libraries: Map<String, Any> by project.extra dependencies { implementation(libraries["guava"] as String) }
该方案的缺点是丢失了类型安全检查,IDE无法自动补全依赖名称。
内容的提问来源于stack exchange,提问作者Hakanai
相关产品推荐
相关产品推荐

