如何在 Gradle 找到/移除未使用的依赖项

我希望在我的项目中找到未使用的依赖项,在 Gradle 有这样的特性吗?

74374 次浏览

编者按: 此答案已过期,请参阅 最佳答案

您可以尝试的 依赖性分析级插件

构建脚本代码片段,以便在所有 Gradle 版本中使用:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
}
}


apply plugin: "com.github.nullstress.dependency-analysis"

构建 Gradle 引入的新的、孵化的插件机制的脚本片段2.1:

plugins {
id "com.github.nullstress.dependency-analysis" version "1.0.3"
}

而且,在 Gradle 论坛上有一个关于这个的帖子(Gradle 是否有“ mvn 依赖性: 分析”的等价物?)。

我在使用 梯度依赖分析插件的时候运气不错。要开始使用它,请将以下两件事情添加到 Gradle 构建脚本中。

buildscript {
repositories {
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
}
}

还有

apply plugin: "dependencyAnalysis"

一旦这些准备就绪,运行 gradle analyze。如果存在未使用的依赖项,您将得到一个构建失败,它显示类似于下面文本的输出,以及一个未使用的依赖项列表(声明的和传递的)。如果您希望通过 CI 构建强制不应该存在未使用的依赖项,那么构建失败确实很方便。

:foo:analyze FAILED


FAILURE: Build failed with an exception.


* What went wrong:
Execution failed for task ':foo:analyze'.
> The project has unused declared artifacts

在前面的答案中提到的项目似乎已经死了。我使用的是 分级-依赖-分析。设置很简单:

buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'ca.cutterslade.gradle:gradle-dependency-analyze:1.0.3'
}
}


apply plugin: 'ca.cutterslade.analyze'

然后:

$ gradle analyzeDependencies

大多数历史答案上的项目都已经死了,但 分级-依赖-分析似乎在2016-05-30年还活着。

对 Kotlin 用户的更新: 2021年12月17日: 检测 Kotlin 项目中丢失或多余的构建依赖关系: 版本1.0.9(最新)

我已经为 Kotlin 用户添加了2种配置类型。

  • 使用插件 DSL
  • 使用遗留插件应用程序

使用插件 DSL:

plugins {
id("com.faire.gradle.analyze") version "1.0.9"
}

使用遗留插件应用程序:

buildscript {
repositories {
maven {
url = uri("https://plugins.gradle.org/m2/")
}
}
dependencies {
classpath("com.faire.gradle:gradle-kotlin-buildozer:1.0.9")
}
}


apply(plugin = "com.faire.gradle.analyze")

资源连结:

  1. Https://plugins.gradle.org/plugin/com.faire.gradle.analyze
  2. Https://github.com/faire/gradle-kotlin-buildozer
  3. Https://discuss.gradle.org/t/detecting-unused-projects-dependencies/25522

更新: 28-06-2016: Android 对未使用依赖的支持

2017年6月中,他们发布了 4.0.0 version 并将根项目名称 "gradle-lint-plugin"重命名为 他们还增加了对 Android 的支持 未使用-依赖项 .


二零一六年五月格拉德尔已经实现的 格拉德线头插头发现和消除不必要的依赖

Gradle Lint 插件: 完整文档

Grandle Lint 插件是一个可插入和可配置的 linter 工具 查明和报告《公约》中滥用或弃用的模式 分级脚本和相关文件。

这个插件有很多规则,未使用的依赖规则就是其中之一,它有三个特点。

  1. 移除未使用的依赖项。
  2. 促进代码直接使用的传递依赖项 显式的一阶依赖关系。
  3. 将依赖项重新定位到“正确”配置。

要应用该规则,请添加:

gradleLint.rules += 'unused-dependency'

最后给出了 未使用的依赖规则的具体内容。

使用 Gradle 线头插件:

buildscript { repositories { jcenter() } }
plugins {
id 'nebula.lint' version '0.30.2'
}

或者:

buildscript {
repositories { jcenter() }
dependencies {
classpath 'com.netflix.nebula:gradle-lint-plugin:latest.release'
}
}


apply plugin: 'nebula.lint'

定义你想要反对的规则:

gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like

对于一个企业版本,我们建议在 init.Gradle 脚本或者 Gradle 脚本中定义 lint 规则,这些脚本是通过 Gradle application from 机制包含的。

对于多模块项目,我们建议在 allprojects块中应用该插件:

allprojects {
apply plugin: 'nebula.lint'
gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like
}


这一部分给出了 未使用的依赖规则的详细信息

要应用该规则,请添加:

gradleLint.rules += 'unused-dependency'

该规则检查从项目的 源集合发出的已编译二进制文件,查找类引用,并将这些引用与在 依赖关系块中声明的依赖项匹配。

具体来说,该规则对依赖项进行以下调整:

1. 删除未使用的依赖项

  • 像 com.amazonaws.aws: aws-java-sdk 这样的家庭风格的罐子被删除,如 它们不包含任何代码

2. 将代码直接使用的传递依赖项提升为显式的一阶依赖项

  • 这会产生分解家族样式 JAR 文件的副作用,比如 Com.amazonws: aws-java-sdk,变成你实际上是的那部分 使用和添加它们作为一阶依赖项

3. 将依赖项重新定位到“正确”配置

  • Webjar 被移动到运行时配置
  • 在 META-INF 之外不包含任何类 还有内容的 JAR 文件是 转移到运行时
  • ‘ xerces’、‘ xercesImpl’、‘ xml-apis’应该始终在运行时范围内
  • 服务提供程序(包含 META-INF/服务的 JAR 文件)类似于 如果没有任何可证明的 编译时引用
  • 依赖关系被移动到最高的源集配置 例如,‘ junit’被重新定位到 testCompile,除非 在主源集中有一个明确的依赖关系(罕见)。


更新: 以前的插件

对于您的种类信息,我想分享关于以前的插件

  1. 寻找未使用的依赖项、声明和传递的 Gradle 插件是 依赖性分析

但是 其最新版本1.0.3于2014年12月23日创建之后就没有更新了。

注意: 我们的许多工程师对 这个插件感到困惑,因为他们 只更新了版本号,其他什么都没有。

我刚知道这个: https://plugins.gradle.org/plugin/com.autonomousapps.dependency-analysis

Github

从外观上看,它正在积极开发,但我还没有测试它。

编辑: 实际上它非常棒,它提供了很多建议(例如是否使用 api 与实现)