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

Posted

技术标签:

【中文标题】从 Gradle v7+ 获取版本目录中所有依赖项的列表【英文标题】:Getting a list of all dependencies in the Versions Catalogue from Gradle v7+ 【发布时间】:2021-12-23 02:53:11 【问题描述】:

Gradle 7 引入了 [版本目录][1]。有了它,我可以轻松地将依赖项称为例如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()
               ] 

【问题讨论】:

【参考方案1】:

我在 OP 中使用了反射破解,因为我无法让 findDependency() 处理 Gradle 7.3 中已经定义的 libs(它在 7.2 中有效)。通过手动获取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()]
               

不过,我仍然对其他改进感兴趣。

【讨论】:

以上是关于从 Gradle v7+ 获取版本目录中所有依赖项的列表的主要内容,如果未能解决你的问题,请参考以下文章

Gradle - 获取依赖项的最新发布版本

如何从 Gradle 中的所有依赖项中忽略特定的传递依赖项

如何将 Gradle 依赖项更新到最新版本

查找未使用的gradle运行时依赖项

如何在gradle构建文件中将哪个依赖项和依赖项版本打包到war文件中?

如何从 Kotlin DSL build.gradle 中的所有依赖项中排除库?