gradle依赖树是您的Gradle构建的骨干。它的表示可以帮助您可视化项目中所有Gradle依赖的结构以及任何及其依赖性。不久前,我编写了一个Twitter线程,分享了一些提示,以调试您的慢速gradle构建,这使我进入了更深入地进入该主题的旅程。
这是一个很好的问题,可以刷新和修改我从前票,尤其是@inyaki_mwc&@jperezalv
中记得的常见嫌疑人
来修改我多年来学到的东西 我会尝试总结我在𧵠https://t.co/lgZDmeIKTnishan khanna(@droidchef)November 17, 2022
在本文中,我讨论
- gradle中的依赖性和及时依赖性是什么?
- gradle中的依赖树是什么?
- Gradle中有什么不同的依赖配置?
- 在Gradle项目中生成依赖树的五种方法。
通过阅读整篇文章,您将
- 对gradle依赖树有一个可靠的理解
- 配备知识来使用任何项目的不同方式生成gradle依赖树。
让我们开始介绍一些基础知识。
Gradle的依赖性是什么?
gradle的依赖性是两个元素之间的关系,这些元素允许一个元素访问另一个元素的内容,资源或库。它可以是在项目中的模块或外部依赖项之间的,例如 maven Central 和 Jcenter 。
。gradle依赖关系通过指定所使用的依赖项的版本来建立两个元素之间的关联。当Gradle构造依赖关系树时,它同时考虑了及依赖性和直接依赖。
什么是Gradle的传递依赖性?
gradle中的传递依赖性是另一个依赖性所隐含的依赖性,因此从外部来源引入了项目。
使用原始依赖性声明的库的版本解决了传递依赖关系,然后将其所有这些库都包含在您的项目中。
,如果您不小心管理gradle依赖关系,这可能会导致项目中不必要的膨胀。
不同类型的传递依赖性
它们既可以是直接又可以是间接;例如,如果您声明对库A的直接依赖性,该库A对库B具有传递性依赖性,则您还将最终以库B作为项目依赖性包含在项目中。
§
当多个模块具有同一库的不同版本时,传递依赖性可能会变得复杂。 Gradle将尝试通过选择可用的最新版本来解决此问题。
仔细管理这些各种版本很重要,以避免您的项目中的冲突或其他意外行为。
在Gradle项目中配置Gradle依赖项
gradle使我们能够通过指定依赖关系配置来分组依赖关系。您可能已经在项目的build.gradle
文件中看到了implementation
,androidTestImplementation
或testImplementation
之类的单词。
默认情况下,gradle构建不支持任何依赖性配置,但是它们通过插件与您的构建集成在一起,例如 android 插件, kotlin 插件或 java 插件。
Gradle使用这些配置来生成用于生产或测试项目的类Paths。
在生成依赖关系树之前,要知道这一点很重要,因为您可能会开始想知道为什么构建中有多个配置。
随着基础知识的发展,现在是时候开始生成依赖项树了。
生成gradle依赖树
有五种产生gradle依赖性的方法。最快的方法是使用依赖项任务。但是,它可能并不总是合适的,或者给您最好的结果。因此,我们将浏览您可以生成和可视化的所有不同方式。
我个人不使用或建议将Android Studio用于编写代码以外的任何内容,尤其是在您正在使用相对较大的代码库时。但是,我仍然为任何冒险的人谈论它。
先决条件
如果您想遵循下面的部分中运行的命令。您可以通过完成以下步骤来设置我创建的轻量级sample project,以演示the impact of dependency tree depth on your gradle builds。
- 打开终端,然后转到保存项目的目录,对我来说,是
~/dev/
cd ~/dev/
- 克隆这样的示例根项目
git clone git@github.com:droidchef/dep-height-example.git
- 将目录更改为这样的根项目
cd dep-height-example
现在您准备运行下面的步骤中提到的所有命令。
1.在命令行中使用依赖项任务
为您的项目生成依赖性树的最简单方法是在项目的根源上运行依赖项任务,这就是您的工作方式。
在您的终端中,转到应用程序的根目录,然后在命令行上运行以下内容
./gradlew :{moduleName}:dependencies
这里应该用要查看依赖项树的模块的名称代替{moduleName}
。
一个多模块项目的示例具有一个名为contractor
的模块,我将尝试通过运行以下
来列出它的gradle依赖项
./gradlew :contractor:dependencies
这是输出的外观
您可以看到,依赖项任务的输出非常详细,因为它包含了所有配置,类路径,元素及其各自的元数据的结果。
幸运的是,我们在Gradle的惊人同事为我们提供了一种控制结果的机制,以仅显示特定的配置类型,这是您在调查期间大部分时间都使用的。
如何通过配置过滤依赖性?
您可以将配置参数与Gradle中的依赖项任务一起使用特定配置类型的依赖项。
这就是您将如何构建Gradle任务
./gradlew :{yourModuleName}:dependencies --configuration {yourConfigurationName}
这是一个示例,显示了样本多模块项目的contractor
模块的实现依赖项
./gradlew :contractor:dependencies --configuration implementation
这是示例结果
配置任务的支持参数列表
configuration
参数支持以下输入
compile
testCompile
implementation
testImplementation
如果您的根项目是一个Android项目,那么您也可以与上述输入一起访问这些项目
androidTestCompile
androidTestImplementation
这是显示如何使用上述参数
的示例
./gradlew :{moduleName}:dependencies --configuration compile
./gradlew :{moduleName}:dependencies --configuration testCompile
./gradlew :{moduleName}:dependencies --configuration testImplementation
./gradlew :{moduleName}:dependencies --configuration androidTestCompile
./gradlew :{moduleName}:dependencies --configuration androidTestImplementation
2.使用项目报告插件
如果您有一个大项目或小屏幕,也可以使用插件生成依赖项报告。该插件称为项目报告插件。它将为您提供基于HTML的依赖项报告,使您可以在您喜欢的浏览器中浏览整个依赖项。
设置非常容易,这就是您的工作方式。
如何集成项目报告插件?
- 在项目的根目录中打开
build.gradle
文件。 - 将其添加到文件的顶部
apply plugin: 'project-report'
或
plugins {
id 'project-report'
}
- 在您的IDE中同步该项目( 可选 )
- 在您的终端中运行以下命令
./gradlew htmlDependencyReport
- 打开Gradle生成的HTML报告。文件路径通常是
{project root}/build/reports/project/dependencies/index.html
,其中{project root}
是指项目的根目录。
您也可以在此file://
路径上进行Command (or Cmd) ⌘ + Click
,并且应该在浏览器中打开。
打开此报告时,您将看到为其生成报告的项目。
- 单击 root项目 url以查看可搜索的依赖性报告
- 单击不同的依赖配置以详细查看报告。
3.使用gradle依赖图生成器插件
现在,如果您真的有兴趣深入研究项目的依赖结构。存在主要用于此目的的第三方Gradle插件。我个人发现在处理模块化时或想立即浏览整个依赖树时很有用。
它被称为gradle-dependency-graph-generator-plugin ,由Niklas Baudy开发和维护。
您可以使用它以PNG,SVG和DOT等格式为您的项目依赖性生成视觉图。
如何集成Gradle依赖图Graph Generator插件?
- 打开root项目的
build.gradle
文件
您也可以将其添加到特定的项目或模块中,并且可以正常工作
- 将以下内容添加到Gradle文件中。
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "com.vanniktech:gradle-dependency-graph-generator-plugin:0.8.0"
}
}
apply plugin: "com.vanniktech.dependency.graph.generator"
或
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath "com.vanniktech:gradle-dependency-graph-generator-plugin:0.8.0"
}
}
plugins {
id 'com.vanniktech.dependency.graph.generator' version '0.8.0'
}
- 与您的IDE中的Gradle同步,并在您的终端中运行此任务
./gradlew generateDependencyGraph
这将在此目录build/reports/dependency-graph/
中生成gradle依赖关系图。
4.使用gradle build扫描
gradle build扫描就像您的gradle和maven builds的X射线。
如果您在Gradle项目中使用构建扫描。您可以免费访问项目依赖关系。如果您以前从未产生Gradle Build Scan,则可以在两分钟以下免费生成一个。。
。您唯一需要的是您在终端中运行的任何gradle命令末尾的--scan
参数。
让我们使用一个简单的命令列出项目的任务以生成构建扫描。
继续并在项目的根目录中运行此命令。
./gradlew tasks --scan
构建结束后,将提示您进行确认以生成构建扫描。这是因为Gradle将收集有关硬件的构建信息和信息,并将其发送给他们的服务器。
如果您还可以,请键入yes
并点击Enter
。
然后,您会看到终端中的个人构建扫描访问页面的链接。
打开浏览器中的URL,这就是您会看到的。
现在要获取有关您依赖项的信息,请单击依赖项在左菜单导航菜单中的项目。
这将向您显示一个可互动的可搜索依赖性报告,其中
- 您可以搜索依赖项。
- 您可以看到不同配置的依赖项。
- 您可以找出哪个库,模块或项目使用此依赖项。
- 您甚至可以查看它们来自哪个存储库。
除此之外,您还可以访问此版本扫描报告中的更多信息。但是,这是本文的范围。
最后,让我们看一下使用Android Studio生成项目依赖关系树的最直接方法。
5.使用Android Studio的Gradle插件
您可以使用Android Studio的Gradle插件来生成和查看Gradle依赖性的结构。这似乎是最简单的方法。但是,i 不建议这样做大规模项目,因为它可以大大减慢的速度。这就是原因,我将这种方法讨论为最后一种。
如何使用Android Studio生成Gradle依赖树?
- 首先打开您的Android Studio,然后单击Gradle Tab。
-
适用于Android项目
然后扩展
:yourmodule
->Tasks
->android
。最后,双击androidDependencies
执行任务。 -
用于Java或Kotlin项目
然后扩展
:yourmodule
->Tasks
->help
。最后,双击dependencies
执行任务。
Android Studio在Gradle Project中显示依赖性生成任务
- 在执行此任务后,它将在Android Studio的控制台中打印整个依赖树报告。
什么是遗漏的依赖性?
您可能会在输出中加入一条消息
(*) - dependencies omitted (listed previously)
这意味着Gradle从依赖项树中删除了重复的部分,以保持输出简洁。它实际上不会影响您的真实依赖图。
什么是失败的依赖性?
在依赖关系树的输出中,如果将任何依赖项标记为FAILED
,则意味着gradle无法在您的任何配置存储库中找到它。
可能是由于许多原因,包括但不限于:
- 不正确的版本
- 连接问题
- 机器上的代理问题
- 拼写错误的依赖性名称
什么是依赖配置继承?
您可能在上面的截图中看到的依赖项配置支持继承。当依赖关系配置从另一种配置继承时,它会自动访问其父的所有依赖项。
例如,考虑一个Android项目。该应用程序的build.gradle
文件将具有自己的依赖关系,例如Android支持库和项目使用的任何第三方库。
但是,这些依赖项也可以从其他范围(例如库模块甚至您的组织的内部存储库中)继承。这使您可以轻松地通过最新的库来保持项目的最新状态,并简化维护。
gradle依赖配置继承使管理复杂的项目变得容易。
结论
通过阅读这篇文章,您现在应该对gradle依赖树有一个可靠的了解,并且现在配备了知识,以使用任何项目的不同方式生成Gradle依赖树。请在LinkedIn和Twitter上分享这篇文章。
如果您对此有任何疑问,请随时在下面发表评论!