如何在Gradle任务中获取依赖库版本并拦截SNAPSHOT版本构建
在Gradle任务中检查指定依赖的版本并拦截快照版本
刚好做过类似的需求,给你两个可靠的解决方案,直接就能实现你要的功能——获取指定依赖版本并拦截快照版本的构建:
方案1:通过依赖配置遍历查找(支持传递依赖)
这种方式可以找到直接声明或间接引入的目标依赖,通用性更强。下面是完整的可运行任务代码:
task checkLibVersion { doLast { // 指定要检查的依赖坐标(group:name) def targetDependency = "io.mylib:core" // 遍历runtimeClasspath配置(可根据实际需求替换为compileClasspath等) def matchedDep = configurations.runtimeClasspath.resolvedConfiguration.resolvedArtifacts.find { it.moduleVersion.id.group + ":" + it.moduleVersion.id.name == targetDependency } if (!matchedDep) { throw new GradleException("未找到目标依赖: $targetDependency") } def version = matchedDep.moduleVersion.id.version if (version.endsWith("-SNAPSHOT")) { throw new GradleException("Mylib使用了快照版本: $version,构建终止") } else { println "Mylib版本检查通过: $version" } } }
关键细节说明:
- 使用
doLast闭包:确保任务执行阶段才去解析依赖,避免在配置阶段就触发依赖解析(会拖慢构建速度) - 选择合适的配置:
runtimeClasspath包含所有运行时依赖,若只需检查编译期依赖,可替换为compileClasspath - 精准匹配逻辑:通过
group:name组合匹配,避免同名不同组的依赖冲突
方案2:直接查找声明的依赖(Gradle 7.0+)
如果你只需要检查直接声明的依赖,且使用Gradle 7.0及以上版本,可以用更简洁的写法:
task checkLibVersion { doLast { // 直接匹配group和name def matchedDep = project.dependencies.find { it.group == "io.mylib" && it.name == "core" } if (!matchedDep) { throw new GradleException("未找到直接声明的目标依赖") } def version = matchedDep.version if (version.endsWith("-SNAPSHOT")) { throw new GradleException("Mylib快照版本禁止发布: $version") } } }
注意事项:
- 此方法仅能找到
dependencies块中直接声明的依赖,无法识别传递依赖 - 如果依赖是通过平台/BOM引入的,需要调整查找逻辑
集成到发布流水线
最后可以把检查任务和发布任务关联,确保发布前自动执行版本检查:
// 让publish任务依赖checkLibVersion,先检查再发布 tasks.named('publish') { dependsOn checkLibVersion }
这样每次执行发布操作时,都会先自动检查依赖版本,一旦发现快照版本就直接终止构建,完全符合你的流水线需求。
内容的提问来源于stack exchange,提问作者Andy Res
相关产品推荐
相关产品推荐

