使用gradle查找依赖树


542

是否可以使用gradle生成取决于什么的树?

我有一个项目,想找出所有的依赖关系,这样我就可以使用前向声明等对其进行一些修剪。



@OliverCharlesworth请使用关闭按钮将答案标记为重复
030

1
@ user3286701也许您可以接受答案之一?
030

5
gradle dependencies应该管用。每个人都这么疯狂gradlew app:dependencies可能是因为Android。
prayagupd

2
@prayagupd这应该是答案。问题是关于gradle。阅读了排名很高的答案后,我打开了终端,然后将其安装到使用gradle的常规项目的目录中。我执行了“ gradle app:dependencies”并得到了“ Build failed”错误,尽管我不打算构建任何东西。我的项目构建良好,我只想查看依赖关系。
ka3ak

Answers:


604

对于Android,使用此行

 gradle app:dependencies

或者,如果您有gradle包装器:

./gradlew app:dependencies

app您的项目模块在哪里。

另外,如果您想检查某物是否是compilevs. testCompilevs androidTestCompile依赖关系以及将其引入其中的原因:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>

10
啊,我必须在这里放模块名。这就是为什么...谢谢!
Jenix

现在刚开始学习gradle,所以有点困惑。我可以将gradlew视为gradle,我可以输入与gradlew相同的选项/命令吗?
Jenix

1
@Jenix是的,如果你使用的包装只是用./gradlew代替gradle
乍得宾厄姆

2
Project 'app' not found in root project运行这些命令时出现错误。本杰明的解决方案却奏效了。
krock

5
实际上./gradlew :dependencies会起作用。它将列出所有项目的依赖项,但是很容易找到合适的依赖项。
dirkjot

240

您可以使用命令呈现依赖关系树gradle dependencies。有关更多信息,请参见在线用户指南中的11.6.4列出项目依赖项


2
当我使用Android项目执行此操作时,我得到的只是以下输出: pastebin.com/fHFigAuY建议?
Nilzor

3
@Nilzor您可能在错误的目录(不包含build.gradle文件)中执行命令,或者您的构建文件未应用任何插件。
本杰明·穆奇科

6
您可以使用gradle:project:dependencies
mbonnin

2
Android Studio插件-用于分析依赖关系的Gradle视图
Jignesh Patel'7

3
如果使用包装器:./gradlew dependencies
ScrappyDev

152

如果您发现难以导航的控制台输出gradle dependencies,则可以添加“ 项目报告”插件

apply plugin: 'project-report'

并使用以下命令生成HTML报告:

$ ./gradlew htmlDependencyReport

通常可以在以下位置找到报告 build/reports/project/dependencies/index.html

看起来像这样: 在此处输入图片说明


2
对我来说只是gradle htmlDependencyReport
Richard Tingle 18'Apr

2
这不适用于多模块项目。我只看到一个空白列表。
亚当·阿罗德

1
很棒的发现。插件实际上的作用更多docs.gradle.org/current/userguide/project_report_plugin.html
ruX

78

在Android Studio中(至少从v2.3.3开始),您可以直接从UI运行命令:

单击Gradle选项卡,然后双击:yourmodule-> Tasks-> android-> androidDependencies

该树将显示在Gradle Console选项卡中

一张图像值一千个字


1
我如何获得“渐变项目”视图?
user3526'1/

1
@ user3526单击屏幕右侧的“ gradle”标签。看附加图像以供参考
尼古拉斯Carrasco的

2
我发现这会在AS 3.2.0中创建一个平面列表,而不是树。但是,命令行变体会创建一棵树。
汤姆(Tom)

5
@Tom在“帮助”类别下而不是“ android”类别下运行“依赖”任务。它显示为树
Maxim Berezovsky,

27

通常,complete testcompileandroidTestCompile依赖图太多,无法一起检查。如果仅需要compile依赖关系图,则可以使用:

./gradlew app:dependencies --configuration compile

来源:Gradle文档第4.7.6节

注意:compile在Gradle的最新版本中已不推荐使用,在更新的版本中,建议将所有compile依赖项都移至implementation。请在这里看到这个答案


4
只是一个提示:编译已被弃用,人们现在应该着手实施
reinaldomoreira

25

如果要在图形中可视化依赖关系,可以使用gradle-dependency-graph-generator插件。

通常,此插件的输出可在build / reports / dependency-graph目录中找到,如果使用的是0.5.0版本,则它包含三个文件(.dot | .png | .svg)。

真实应用程序(Chess Clock)中的依赖关系图示例:

图形


嗨,大卫,我按照插件说明中的指示进行操作。我在gradle项目中应用了插件,但是在构建目录中没有看到任何reports文件夹。除了构建和运行项目外,我们还有什么需要做的吗?
Rushi M Thakker,

此插件未显示依赖项版本和冲突。对于Maven来说就是这样;github.com/janssk1/maven-graph-plugin/wiki/Manual,这使它无用..
sytolk

18

对于Android,在终端中输入

gradlew app:dependencies

它将列出所有依赖项以及具有较新版本的依赖项,供您升级,例如

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)

15

Gradle的情况已经向前发展,所以我相信这个问题值得另一个答案。
从Gradle 4.3开始,引入了“ 构建扫描 ”。所有相关信息是在摇篮文档(可12)。对我而言,这似乎是以一种清晰,有组织的方式检查依赖关系(通常是您的构建)的最简单方法。

它们非常易于创建,只需执行即可:

gradle build --scan  

(或者./gradlew build --scan如果您使用包装器)

这将产生一个随机生成的链接,您可以在其中查看扫描结果。打开该链接时,您输入电子邮件并完全控制该链接:例如。分享或删除它。它有很多有关构建的信息,而不仅仅是依赖关系。您可以看到您的依赖项,它们的层次结构,用于获取它们的存储库,以及有关构建的许多其他内容,即其性能(在大型复杂构建中很重要),测试,甚至控制台输出和系统配置,使用的是JDK和JVM,最大堆大小等。

这是来自模拟项目的打印屏幕:

构建扫描示例

构建扫描是构建的可共享记录,可提供有关发生情况和原因的见解。您可以在scans.gradle.com上免费创建构建扫描。

但是请注意,构建过程的信息将发送到Gradle服务器。完成检查后,可以完全删除它。

最后,您也可以对Gradle 4.3之前的版本使用构建扫描,只需在构建脚本中手动添加扫描插件即可。

编辑
从评论中吸收一些额外的注释反馈:
1)很难错误地执行此操作,或者在不了解您的构建的某些信息将在线的情况下(对您来说是私有的,可以删除它,但是仍然在线) )。

执行时gradle build --scan出现以下消息:

Publishing a build scan to scans.gradle.com requires accepting the Gradle
Terms of Service defined at https://gradle.com/terms-of-service. Do you
accept these terms? [yes, no]

您必须显式编写yes,然后消息继续:

Publishing build scan...  
https://gradle.com/s/a12en0dasdu

2)在Gradle Enterprise中,您可以在自己的服务器中托管gradle构建扫描。但是我对此没有经验,我提出的方法是关于标准Gradle分发,使用Gradle的服务器进行构建扫描。

3)Gradle本身促进了构建扫描,以此作为解决大多数构建问题的方法。


11
对不起,我拒绝回答这个问题,但是IMO并没有回答问题,也没有足够明确地警告gradle build --scan您通过 在Internet上的某个位置发布构建的详细信息-并删除它,您必须将其与正常工作的电子邮件地址相关联。
Michal

1
嗨Michal,如果您有这种想法,欢迎您投票。但是我不得不问,您尝试过吗?gradle build --scan在cmd中执行 时,提示您:Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]。您必须手动编写yes。紧接着,您会收到消息:( Publishing build scan... https://gradle.com/s/a12en0dasdu随机放置相同类型的链接)。因此,我相信它确实会在适当时候警告您。(1/2)
tryman '19

1
您可以访问链接并立即删除扫描,而无需发送电子邮件或任何内容。作为回答,我相信它确实回答了这个问题。实际上,与其他方法相比,它向您显示了有关依赖项的更多信息(以及更多的努力:整个构建也有额外的信息)。如果您没有按自己的喜好找到它,那完全可以,但就我所知,它是目前最全面的工作工具,因此牢记这一点很有价值。最后,它是由Gradle本身推广的,实际上是他们的第一本指南(2/2)
tryman

@Michal对不起,您之前忘了标记您的名字,因此您可能看不到我的评论。(我还编辑了帖子,以包含我对您答复的评论。)
tryman

2
我没有尝试过-感谢您澄清有关条款的接受程度。我删除了-1。
Michal

9

在Android Studio中

1)打开终端,并确保您位于项目的根文件夹中。

2)运行./gradlew app:dependencies (如果不使用gradle包装器,请尝试 gradle app:dependencies

注意,运行./gradle dependencies只会给您项目根目录的依赖树,因此以上述方式提及应用程序 ./gradlew app:dependencies非常重要。


1
对我来说,它没有使用“ ./”,就像这样:gradlew app:dependencies。
吉拉德·莱文森


7

请注意,./gradlew <module_directory>:<module_name>:dependencies如果模块在到达其build.gradle之前具有额外的目录,则可能需要执行类似的操作。如有疑问,请./gradlew tasks --all检查名称。


7

对我来说,这只是一个命令

在build.gradle中添加 plugin

apply plugin: 'project-report'

然后转到cmd并运行以下命令

./gradlew htmlDependencyReport

这给了我HTML报告WOW HTML报告💕

那就是我所有的主人。


Devstr已经回答了。
brute_force

是的,谢谢@brute_force那时我看不到它。您想要什么,删除我的答案?
Dupinder Singh

1

对于Gradle的最新版本(我使用6.4.1版本进行了测试):

gradle dependencies --configuration compileClasspath

或者如果您正在使用Gradle Wrapper:

gradlew dependencies --configuration compileClasspath

0

如果要在两个步骤的最后将所有依赖项放在一个文件中。将此添加到您build.gradle.kts的项目的根目录中:

project.rootProject.allprojects {
    apply(plugin="project-report")

    this.task("allDependencies", DependencyReportTask::class) {
        evaluationDependsOnChildren()
        this.setRenderer(AsciiDependencyReportRenderer())
    }

}

然后申请:

./gradlew allDependencies | grep '\-\-\-' | grep -Po '\w+.*$' | awk -F ' ' '{ print $1 }' | sort | grep -v '\{' | grep -v '\[' | uniq | grep '.\+:.\+:.\+'

这将为您提供项目和子项目中的所有依赖关系以及所有第三方依赖关系。

如果要以编程方式完成此操作,则需要一个自定义的依赖项渲染器-您可以通过扩展扩展程序来开始AsciiDependencyReportRenderer,默认情况下,该打印机将打印依赖项的ascii图。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.