Gradle多项目构建中如何复用子项目依赖且不修改原文件?
解决Gradle项目复用依赖的问题
核心方案
不要直接赋值dependencies对象或添加整个配置,正确的做法是遍历原项目的依赖配置,将对应配置下的依赖逐一映射到当前项目的同名配置中。Gradle的依赖配置有层级结构,直接替换或添加配置会导致逻辑混乱,映射对应配置的依赖才是合规方式。
通用实现代码
在lib-internal的build.gradle中添加以下代码:
// 获取开源库项目引用 def openSourceProject = project(':lib-open-source') // 保留你已实现的源码复用逻辑 sourceSets.main.java.srcDirs = [openSourceProject.projectDir.toString() + '/src/main/java'] // 遍历并复用原项目所有依赖配置 openSourceProject.configurations.each { sourceConfig -> def targetConfig = configurations.findByName(sourceConfig.name) if (targetConfig != null) { sourceConfig.dependencies.each { dep -> targetConfig.dependencies.add(dep) } } }
精准复用指定配置(推荐)
如果只需要复用特定依赖配置(比如业务依赖、测试依赖),可以直接指定配置列表,避免处理无关配置:
def openSourceProject = project(':lib-open-source') sourceSets.main.java.srcDirs = [openSourceProject.projectDir.toString() + '/src/main/java'] // 按需指定要复用的配置名称 def targetConfigs = ['implementation', 'compileOnly', 'testImplementation', 'testCompileOnly'] targetConfigs.each { configName -> def sourceConfig = openSourceProject.configurations.findByName(configName) def localConfig = configurations.findByName(configName) if (sourceConfig != null && localConfig != null) { sourceConfig.dependencies.each { dep -> localConfig.dependencies.add(dep) } } }
原写法失效原因说明
dependencies = project(':lib-open-source').getDependencies():dependencies是Gradle管理的依赖容器,直接赋值会破坏容器的内部结构,Gradle不允许这种操作,必须通过API添加依赖。configurations.add(project(':lib-open-source').configurations.compileClasspath):compileClasspath是已完成解析的配置,直接添加会引发配置冲突,且不会自动继承其依赖项,本质是错误的配置复用方式。
内容的提问来源于stack exchange,提问作者87VN0
相关产品推荐
相关产品推荐

