使用Gradle查找依赖树

804

是否可以使用Gradle生成依赖关系树?

我有一个项目,并希望找出所有的依赖关系,以便可以通过前向声明等方式来对其进行修剪。


4
可能是“什么是Gradle依赖关系图命令?”的重复问题。 - Oliver Charlesworth
16个回答

933

没有模块:

gradle dependencies

对于Android:

 gradle app:dependencies

使用Gradle包装器:

./gradlew app:dependencies

注意:app替换为项目模块名称。

此外,如果您想检查某个依赖项是compile还是testCompile还是androidTestCompile,以及是谁拉取了它:

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

1
啊,我猜‘app’是你当前Gradle项目的子模块。原来我没有在你的回答中读到这句话:“其中'app'是你的项目模块。”感谢你的回复! - krock
3
我也不了解项目模块(这个传统的项目结构非常奇怪)。但这个命令可以帮助我:./gradlew -q dependencies :dependencies,它会搜索你所有的文件夹。 :P - Alberto Maluje
13
实际上,运行命令 ./gradlew :dependencies 即可。它会列出所有项目的依赖项,但很容易找到正确的那个。 - dirkjot
2
在一个非 Android 项目中,使用 Gradle 包装器运行 ./gradlew dependencies 是可以的(而 ./gradlew app:dependencies 则会给出以下错误 / 异常信息:“在根项目 'spring-petclinic' 中未找到项目 'app'。”)。 - Marit
这并不显示依赖树(传递依赖项),它只列出直接实现。 - Pratzz
显示剩余6条评论

284
您可以使用命令gradle dependencies来呈现依赖树。如需更多信息,请参阅在线用户指南中的列出项目依赖项部分。

2
当我在我的Android项目中执行此操作时,我得到的只是这个输出:http://pastebin.com/fHFigAuY 有什么建议吗? - Nilzor
3
你可能是在错误的目录中执行了该命令(该目录中不包含build.gradle文件),或者你的构建文件未应用任何插件。 - Benjamin Muschko
7
您可以使用Gradle获取特定项目的依赖项:project:dependencies。 - mbonnin
2
Android Studio 插件 - Gradle View 用于分析依赖关系。 - jignesh.world
5
如果您使用包装器:./gradlew dependencies - ScrappyDev

213

如果您发现难以浏览gradle dependencies的控制台输出,您可以添加项目报告插件

apply plugin: 'project-report'

对于多模块项目(大多数项目),您需要配置报告以包括子项目:

htmlDependencyReport {
    projects = project.allprojects
}

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

$ ./gradlew htmlDependencyReport

报告通常可以在 build/reports/project/dependencies/index.html 中找到。

它看起来像这样: 输入图像描述


3
对我来说,只需要运行 gradle htmlDependencyReport 命令。 - Richard Tingle
11
这对于多模块项目不起作用。我只是看到一个空列表。 - Adam Arold
3
发现好东西。插件实际上做了更多事情。https://docs.gradle.org/current/userguide/project_report_plugin.html - ruX
3
如果列表默认展开以进行快速搜索会更好。否则可以在Chrome控制台中查看HTML并搜索。 - lorraine batol
2
@lorraine 它可以创建纯文本报告,gradle dependencyReport - tequilacat
显示剩余2条评论

90
在Android Studio中(至少从v2.3.3开始),您可以直接从UI运行命令:
单击Gradle选项卡,然后双击:yourmodule -> Tasks -> android -> androidDependencies 树形结构将显示在Gradle控制台选项卡中。

An image is worth a thousand words


1
如何获取“Gradle 项目”视图? - user3526
1
请点击屏幕右侧找到的“gradle”标签。参考附图。 - Nicolás Carrasco-Stevenson
3
我发现在AS 3.2.0中,这会创建一个扁平的列表,而不是一棵树。但是命令行变体会创建一棵树。 - Tom
10
请在“help”类别下而不是“android”类别下运行“dependencies”任务。它会显示成树形结构。 - Maxim Berezovsky

60

通常,完整的testImplementationimplementationandroidTestImplementation依赖关系图太大了,难以一起检查。如果你只想要implementation依赖关系图,可以使用:

./gradlew app:dependencies --configuration implementation

来源: 在项目中列出依赖项

注意: 在较新版本的Gradle中,compile已被弃用,并建议将所有compile依赖项转移到implementation。请参见这里的答案


8
只是一条注释:compile已被弃用,人们现在应该转向implementation。 - reinaldomoreira
2
你也可以使用:dependencies代替app:dependencies - Janos Vinceller

33

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

build.gradle中添加plugin

apply plugin: 'project-report'

然后打开命令提示符并运行以下命令

./gradlew htmlDependencyReport

这为我提供了一个HTML报告,WOW HTML报告


或者,如果您想要以文本文件形式获取报告,为了方便搜索,请使用以下命令

gradlew dependencyReport

这里输入图片描述

就这些了,我的主人。


2
很棒的答案!以防万一,如果有人不知道生成的 html 文件将会在 build/reports/project/dependencies/root.html 中找到。 - Binita Bharati
为多模块项目生成一棵空树。 - Pavel Vlasov
@PavelVlasov gradlew dependencyReport 这个命令非常好用,可以给你提供完整的依赖树。 - Dupinder Singh
这个解决方案难道不是已经在devstr的回答中得到了解答吗?链接 - hc_dev

33
如果你想要用图表来可视化依赖关系,可以使用gradle-dependency-graph-generator插件。
一般来说,该插件的输出可以在build/reports/dependency-graph目录下找到,如果你使用的是插件的0.5.0版本,那么它将包含三个文件(.dot|.png|.svg)。
这是一个真实应用中依赖关系图的例子 (Chess Clock):

graph


1
嘿,David,我按照插件说明所说的做了。我在项目gradle中应用了插件,但是在构建目录中没有看到任何报告文件夹。除了构建和运行项目之外,我们还需要做些什么吗? - Rushi M Thakker
这个插件没有显示依赖版本和冲突,就像Maven的这个插件一样:https://github.com/janssk1/maven-graph-plugin/wiki/Manual。这使它变得无用。 - sytolk
出了什么问题: 任务“:generateDependencyGraph”执行失败。
无法调用“com.kitfox.svg.SVGDiagram.setIgnoringClipHeuristic(boolean)”,因为“diagram”为空。
- Andres Camilo Sierra Hormiga

25

Gradle已经有了新进展,因此我认为这个问题值得另一个答案。
自Gradle 4.3以来,引入了“构建扫描”。所有相关信息都在Gradle文档中(12)。对我来说,这似乎是现在最简单的以清晰、有组织的方式检查依赖项(以及通常的构建)的方法。

创建它们非常容易,只需执行:

gradle build --scan  

(或者使用包装器的./gradlew build --scan )

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

以下是来自模拟项目的截图:

Build scan example

构建扫描是构建的可共享记录,提供了发生了什么以及为什么的见解。您可以免费在 scans.gradle.com 创建构建扫描。

但是请注意,会向Gradle服务器发送有关您的构建过程的信息。完成检查后,您可以完全控制并将其删除。

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

编辑:
根据评论中的一些反馈,增加了一些额外的说明:
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本身推广构建扫描作为解决大多数构建问题的方式。


26
很抱歉要给这个回答投下反对票,但我认为它并没有回答这个问题,并且没有清楚地警告您通过“gradle build --scan”会将您的构建详细信息发布到互联网上,并且您需要使用有效的电子邮件地址关联才能删除它。 - Michal
3
嘿,Michal,如果你觉得不行的话,你可以点“踩”按钮。但我还是要问一下,你试过这个命令吗?在命令提示符中执行gradle build --scan时,会弹出一个提示:“将构建扫描发布到scans.gradle.com需要接受Gradle服务条款,该服务条款在 https://gradle.com/terms-of-service 中定义。您接受这些条款吗?[yes, no]”,你需要手动输入“yes”。之后你会收到一条消息:Publishing build scan... https://gradle.com/s/a12en0dasdu(随机链接)。所以我认为它确实在适当的时候提醒了你。(1/2) - tryman
3
您可以访问链接并立即删除扫描,无需电子邮件或任何其他信息。作为回答,我相信它确实回答了问题。事实上,与其他方法相比,它向您展示了关于依赖项的额外信息(甚至可以为整个构建提供额外信息)。如果您不喜欢它,那完全可以,但据我所知,它是目前为止最全面的工具,因此将其记在心中是有价值的。最后,它是由Gradle自己推广的,这实际上是他们的第一篇指南 (2/2)。 - tryman
@Michal 抱歉,之前忘记标记你,所以你可能没有看到我的评论。(我还编辑了帖子,将我回答你的评论整合进去了。) - tryman
4
我还没有尝试过那个 - 谢谢你澄清关于接受条款的事情。我取消了我的-1。 - Michal

25

对于Android设备,请在终端中输入以下命令:

gradlew app:dependencies

它将列出所有的依赖项,以及需要升级的新版本

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

4
不好意思,关于 (*) 的部分是错误的。(*) 表示该依赖项声明使用前者(26.1.0),但实际构建将使用后者版本(27.1.1)。这篇回答提到了这一点:链接 - wkm
@wkm 没错。原帖是错误的。 - Michał Dobi Dobrzański

18

对于最近版本的Gradle(我测试了6.4.1版本):

gradle dependencies --configuration compileClasspath

如果您正在使用Gradle Wrapper:

gradlew dependencies --configuration compileClasspath

构建 Android 应用时,使用“debug”和“release”编译配置文件时,可以使用 debugCompileClasspathreleaseCompileClasspath 配置替代 compileClasspath

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接