从Gradle v7+获取版本目录中所有依赖项的列表

yc0p9oo0  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(210)

Gradle 7引入了一个版本目录,通过它,我可以轻松地引用一个依赖项,例如libs.jacksonCore,如果它在gradle/libs.versions.toml中定义:

[versions]
jackson = "2.11.1"

[libraries]
jacksonCore = { module = "com.fasterxml.jackson.core:jackson-core", version.ref = "jackson" }

但是,有没有一种方法可以通过编程方式获得所有已定义依赖项的列表呢?
现在,我使用libs对象(属于org.gradle.accessors.dm.LibrariesForLibs类)上的反射作为一种解决方法,但这确实很糟糕:

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()
               ] }
b4lqfgs4

b4lqfgs41#

由于无法让findDependency()处理Gradle 7.3中已定义的libs(它在7.2中有效),我在OP中使用了反射黑客。通过手动获取VersionCatalog,我设法摆脱了该黑客:

def libz = rootProject.extensions
               .getByType(VersionCatalogsExtension).named("libs")
def deps = libz.getDependencyAliases()
               .collect { libz.findDependency(it).get().get() }
               .collectEntries {
                 [(it.getModule().toString()): it.getVersionConstraint().toString()]
               }

不过,我还是对其他的改进感兴趣。

相关问题