如何在Gradle 7及以上版本中编程获取Versions Catalogue所有已定义依赖
Gradle 版本目录依赖列表获取方案
Gradle 7推出了版本目录功能,只要在gradle/libs.versions.toml中完成依赖定义,就能通过类似libs.jacksonCore的形式便捷引用依赖,示例配置如下:
[versions] jackson = "2.11.1" [libraries] jacksonCore = { module = "com.fasterxml.jackson.core:jackson-core", version.ref = "jackson" }
很多场景下需要通过编程方式获取所有已定义依赖列表,目前常用的反射方案虽然可用,但实现不够优雅,常见的Groovy DSL反射实现代码如下:
Map deps = libs.metaClass.methods .findAll { it.returnType.name.endsWith("provider.Provider") } .findAll { it.name.startsWith("get") } .collect { libs."$it.name"().get() } .collectEntries { [ (it.getModule().toString()): it.getVersionConstraint().toString() ] }
官方推荐优雅实现方案
Gradle 从7.4版本开始提供了官方的VersionCatalog API,可以直接获取所有已定义的依赖,无需反射。
Groovy DSL 实现
// 获取libs对应的版本目录实例 def catalog = project.extensions.getByType(VersionCatalogsExtension).named("libs") // 遍历生成依赖映射关系 Map deps = catalog.libraries.collectEntries { lib -> [lib.get().module.toString(), lib.get().versionConstraint.toString()] }
Kotlin DSL 实现
val catalog = the<VersionCatalogsExtension>().named("libs") val deps = catalog.libraries.associate { lib -> lib.get().module.toString() to lib.get().versionConstraint.toString() }
提示:如果使用的Gradle版本低于7.4,暂时只能通过反射方式实现,7.4及以上版本建议优先使用官方API,兼容性和稳定性更好。
除了依赖之外,你也可以调用对应API获取其他配置内容:
catalog.versions遍历所有定义的版本号catalog.plugins遍历所有定义的插件catalog.bundles遍历所有定义的依赖组合包
内容的提问来源于stack exchange,提问作者neu242
相关产品推荐
相关产品推荐

