使用Gradle查找依赖树

是否有可能使用Gradle来产生一棵树,这取决于什么?

我有一个项目,想找出所有的依赖关系,这样我就可以用前向声明等来修剪它。

690635 次浏览

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

没有模块:

gradle dependencies

对于Android:

 gradle app:dependencies

使用gradle包装器:

./gradlew app:dependencies

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

此外,如果你想检查某个东西是否是compile vs.testCompile vsandroidTestCompile依赖项,以及是什么吸引了它:

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

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

apply plugin: 'project-report'

并使用以下方法生成超文本标记语言报告:

$ ./gradlew htmlDependencyReport

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

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

在Android Studio

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

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

请注意,运行./gradle dependencies只会给你项目根文件夹的依赖关系树,因此以上述方式提及应用程序,即./gradlew app:dependencies很重要。

通常,完整的testImplementationimplementationandroidTestImplementation依赖图无法一起检查。如果您只想要implementation依赖图,您可以使用:

./gradlew app:dependencies --configuration implementation

图片来源:列出项目中的依赖项

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

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

单击Gradle选项卡,然后双击组件定义:你的模块->任务->Android依赖

该树将显示在Gradle控制台选项卡中

一张图片胜过千言万语

我还发现运行这个很有用:

./gradlew dI --dependency <your library>

这显示了如何解决依赖关系(dependencyInsight),并帮助您调试到build.gradle中需要强制或排除库的位置

请参阅:https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html

如果你想在图形中可视化你的依赖关系,你可以使用g radle-依赖-图-生成器插件。

通常,这个插件的输出可以在构建/报告/依赖-图目录中找到,如果您使用的是0.5.0版本的插件,它包含三个文件(. dot|. png|. svg)。

真实应用程序中的依赖关系图示例(象棋时钟):

graph

请注意,如果模块在到达其build.gradle.之前有额外的目录,您可能需要执行./gradlew <module_directory>:<module_name>:dependencies之类的操作。

Gradle的事情已经向前发展,所以我相信这个问题值得另一个答案。
从Gradle 4.3开始,引入了“构建扫描”。所有相关信息都可以在Gradle文档(12)中找到。对我来说,这似乎是现在以清晰,有条理的方式检查你的依赖项(以及通常你的构建)的最简单方法。

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

gradle build --scan

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

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

这是一个模拟项目的打印屏幕:

构建扫描示例

构建扫描是构建的可共享记录,它提供了对发生的事情和原因的深入了解。您可以在scans.gradle.com免费创建构建扫描。

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

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

编辑
结合评论中的一些反馈一些额外的注释:
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本身促进构建扫描作为处理大多数构建问题的方法。

对于Android,在终端中键入此

gradlew app:dependencies

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

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

如果您希望在两步内将所有依赖项放在单个文件的末尾。 将其添加到项目根目录中的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图。

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

build.gradle中添加plugin

apply plugin: 'project-report'

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

./gradlew htmlDependencyReport

这给了我一个超文本标记语言报告WOW Html报告💕


或者,如果您想在text file中使用报告,请使用以下命令轻松搜索

gradlew dependencyReport

在此处输入图片描述

这是所有我的主。

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

gradle dependencies --configuration compileClasspath

或者如果您使用Gradle Wrapper:

gradlew dependencies --configuration compileClasspath

使用“调试”和“发布”编译配置文件为Android构建时,可以使用debugCompileClasspathreleaseCompileClasspath配置而不是compileClasspath

双击并在gradle视图的帮助下运行依赖项

输入图片描述

试试这个吧

./gradlew dependencies > ~/dependencies.txt

gradle dependencies > ~/dependencies.txt`

它应该将依赖项写入用户主目录下的文本文件中。