如何在build.gradle中以编程方式获取并约束传递依赖版本?
在build.gradle中编程式控制传递依赖版本
完全可以通过Gradle的依赖解析API实现你的需求——无需手动引入group:module,就能强制使用my-dependency-1:module:1.0.0所引入的传递依赖版本。以下是具体实现方案:
核心思路
通过解析指定主依赖(my-dependency-1:module:1.0.0)的依赖树,提取它引入的group:module版本,再通过Gradle的版本强制机制,让所有地方的group:module都使用这个版本。
Groovy实现示例
方式一:实时解析依赖版本
// 定义要追踪的主依赖坐标 def targetMainDependency = "my-dependency-1:module:1.0.0" // 遍历所有配置,对目标传递依赖设置强制版本 configurations.all { config -> config.resolutionStrategy.eachDependency { details -> // 匹配目标传递依赖 if (details.requested.group == 'group' && details.requested.name == 'module') { // 解析主依赖的依赖树,获取对应的传递依赖版本 def resolvedVersion = project.dependencies.create(targetMainDependency) .resolve() .find { it.group == 'group' && it.name == 'module' } ?.version if (resolvedVersion) { details.useVersion(resolvedVersion) details.because "强制使用${targetMainDependency}引入的group:module版本" } } } }
方式二:提前解析(更高效)
提前在项目评估完成后解析主依赖的传递依赖版本,避免每次依赖处理时重复解析:
def targetTransitiveVersion = null // 项目评估完成后,解析主依赖的传递依赖版本 project.afterEvaluate { // 从compileClasspath配置中找到主依赖的传递依赖 def mainDependency = project.configurations.compileClasspath.resolvedConfiguration.firstLevelModuleDependencies .find { it.moduleGroup == 'my-dependency-1' && it.moduleName == 'module' && it.moduleVersion == '1.0.0' } if (mainDependency) { targetTransitiveVersion = mainDependency.children .find { it.moduleGroup == 'group' && it.moduleName == 'module' } ?.moduleVersion } } // 对目标传递依赖设置强制版本 configurations.all { resolutionStrategy.eachDependency { details -> if (details.requested.group == 'group' && details.requested.name == 'module' && targetTransitiveVersion) { details.useVersion(targetTransitiveVersion) details.because "强制使用my-dependency-1:module:1.0.0引入的group:module版本" } } }
注意事项
- 确保
my-dependency-1:module:1.0.0已经被正确引入到项目的依赖中,否则无法解析到对应的传递依赖版本。 - 若使用Gradle 7+,需根据项目实际使用的依赖配置(如
implementation)调整解析时的配置(比如compileClasspath可替换为runtimeClasspath或自定义配置)。 - 该机制会强制所有依赖路径中的
group:module使用指定版本,覆盖其他依赖引入的不同版本。
内容的提问来源于stack exchange,提问作者aarbor
相关产品推荐
相关产品推荐

