如何在 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 配置(例如:implementation
和 api
),更糟糕的是,建议从新配置更改为已弃用的旧配置(例如:@ 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 中查找/删除未使用的依赖项的主要内容,如果未能解决你的问题,请参考以下文章