如何在 Gradle 中查找/删除未使用的依赖项

Posted

技术标签:

【中文标题】如何在 Gradle 中查找/删除未使用的依赖项【英文标题】:How to find/remove unused dependencies in Gradle 【发布时间】:2013-10-23 03:45:45 【问题描述】:

我想在我的项目中找到未使用的依赖项。 Gradle 中是否有类似 Maven 的功能?

【问题讨论】:

【参考方案1】:

我刚刚了解到这个:https://plugins.gradle.org/plugin/com.autonomousapps.dependency-analysis

Github

看起来它正在积极开发中,但我还没有测试过。

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

【讨论】:

我会选择这个,我的结果好多了,谢谢【参考方案2】:

使用Gradle Dependency Analysis Plugin 我很幸运。要开始使用它,请将以下两件事添加到您的 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

【讨论】:

我得到“任务 ':app:analyze' 执行失败。> 项目没有应用 java 插件。”如果我添加“应用插件:'java'”然后我被告知它与现有的 android 应用程序插件不兼容。有什么想法吗? 这听起来像是 Android 应用程序插件特有的东西。我希望我能提供帮助,但我没有使用 Android 的经验! 插件有错误,例如当您对依赖项进行静态调用时,没有考虑在内。 这似乎已被 linter 插件弃用【参考方案3】:

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

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


2016 年 5 月Gradle 实现了Gradle lint plugin 用于查找和删除不需要的依赖项

Gradle Lint Plugin: Full Documentation

Gradle Lint 插件是一个可插入且可配置的 linter 工具,用于 识别和报告滥用或弃用模式 Gradle 脚本和相关文件。

这个插件有各种规则。 Unused Dependency Rule 就是其中之一。它具有三个特定的特征。

    删除未使用的依赖项。 促进您的代码直接使用的传递依赖项 明确的一阶依赖关系。 将依赖关系重新定位到“正确”配置。

要应用规则,请添加:

gradleLint.rules += 'unused-dependency'

Unused Dependency Rule的详细信息在最后部分给出。

应用 Gradle lint 插件:

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'

定义您要针对哪些规则进行 lint:

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

对于企业构建,我们建议在 init.gradle 脚本或通过 Gradle apply from 机制包含的 Gradle 脚本中定义 lint 规则。

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

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



Unused Dependency Rule的详细信息在这部分给出

要应用规则,请添加:

gradleLint.rules += 'unused-dependency'

该规则检查从您项目的source sets 发出的已编译二进制文件以查找类引用并将这些引用与您在dependencies 块中声明的依赖项进行匹配。

具体来说,规则对依赖做了如下调整:

1。删除未使用的依赖项

com.amazonaws:aws-java-sdk 等家庭式 jar 被删除,因为 它们不包含任何代码

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

这具有分解家庭风格 JAR 文件的副作用,例如 com.amazonaws:aws-java-sdk,进入你实际的部分 使用并将它们添加为一阶依赖项

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

Webjar 已移至运行时配置 在 META-INF 之外不包含任何类内容的 JAR 文件是 移至运行时 'xerces'、'xercesImpl'、'xml-apis' 应始终在运行时范围内 服务提供者(包含 META-INF/服务的 JAR 文件)如 如果没有任何可证明的,mysql-connector-java 将移至运行时 编译时参考 依赖关系被移动到最高的源集配置 可能的。例如,“junit”被重新定位到 testCompile,除非 在主源集中对其有显式依赖(很少见)。

更新:以前的插件

为了您的好意,我想分享一下以前的插件

    找到未使用的依赖项、声明和传递的 Gradle 插件是com.github.nullstress.dependency-analysis

其最新版本 1.0.3 是在 2014 年 12 月 23 日创建的。之后就没有任何更新了。

N.B:我们的许多工程师都对this plugin 感到困惑,因为他们 只更新版本号,没有别的。

【讨论】:

我很确定这与 Android/gradle 中的最新更改不兼容。插件没有告诉我可以处理哪些依赖项,而是告诉我添加依赖项并用已弃用的 compile 而不是 implementation 替换其他依赖项。 这个插件很遗憾不适用于 kotlin dsl。他们没有计划支持它。 它也不适用于新的 gradle 配置(例如:implementationapi),更糟糕的是,建议从新配置更改为已弃用的旧配置(例如:@ 987654345@、testCompile等)。 @snowe,Gradle Lint 插件目前不支持 kotlin 构建脚本。如果您想使用 linting,请切换到 groovy 构建脚本。链接:github.com/nebula-plugins/gradle-lint-plugin#warning @SkyWalker 你似乎根本没有阅读我的评论...... >这个插件很遗憾不适用于 kotlin dsl。他们没有计划支持它。【参考方案4】:

大多数历史答案上的项目都已死,但截至 2016 年 5 月 30 日,gradle-dependency-analyze 似乎还活着。

【讨论】:

我看到他们在几周前对 nebula-lint 进行了更改。【参考方案5】:

编者注:此答案已过时。请参阅the top answer。

你可以试试com.github.nullstress.dependency-analysis Gradle 插件

构建脚本 sn-p 以用于所有 Gradle 版本:

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


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

为 Gradle 2.1 中引入的新的孵化插件机制构建脚本 sn-p:

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

此外,Gradle 论坛中有一个关于此的主题 (Is there a Gradle equivalent of "mvn dependency:analyze"?)。

【讨论】:

这个插件似乎是一个死项目......至少在当前的 Gradle 版本中是这样。【参考方案6】:

前面答案中提到的项目似乎已经死了。我使用gradle-dependency-analyze。设置很简单:

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


apply plugin: 'ca.cutterslade.analyze'

然后做:

$ gradle analyzeDependencies

【讨论】:

我正面临这个错误:'Gradle 同步失败:在项目中找不到名称为 'classes' 的任务' 我得到 ***Exception 这样做。没有确切的信息是什么导致了这种情况。我认为这里可能存在循环依赖问题,但我的工具告诉我在哪里是个好主意。 @Pawan 这个插件不适用于 Android 项目,而且这不会很快改变。证明:github.com/wfhartford/gradle-dependency-analyze/issues/18

以上是关于如何在 Gradle 中查找/删除未使用的依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何在 pom 中查找未使用的属性

如何在Android Gradle中添加原生so文件依赖

使用 gradle 未解决 aar 库的传递依赖关系

使用 gradle 未解决 aar 库的传递依赖关系

使用gradle从Java项目中删除未使用的导入

Gradle 依赖项未列出本地 maven jar 的依赖项