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

2022-08-31 07:05:06

我想在我的项目中查找未使用的依赖项。在Gradle中是否有这样的功能,就像在Maven中一样?


答案 1

面向 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

更新:2016 年 6 月 28 日:Android 支持未使用的依赖项

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


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

Gradle Lint 插件:完整文档

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

此插件具有各种规则。未使用的依赖项规则就是其中之一。它有三个具体特征。

  1. 删除未使用的依赖项。
  2. 将代码直接使用的传递依赖项提升为显式一阶依赖项。
  3. 将依赖项重新定位到“正确”的配置。

要应用规则,请添加:

gradleLint.rules += 'unused-dependency'

未使用的依赖关系规则的详细信息在最后一部分中给出。

要应用 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'

定义要针对的规则:

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

对于企业内部版本,我们建议在 init.gradle 脚本或通过 Gradle 应用自机制包含的 Gradle 脚本中定义 lint 规则。

对于多模块项目,我们建议在块中应用插件: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-java-sdk这样的家庭式jar被删除,因为它们不包含任何代码

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

  • 这会产生将家庭样式的JAR文件(如com.amazonaws:aws-java-sdk)分解为您实际使用的部分,并将它们添加为一阶依赖项的副作用。

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

  • Webjars 被移动到运行时配置
  • 在 META-INF 之外不包含任何类内容的 JAR 文件将移动到运行时
  • 'xerces', 'xercesImpl', 'xml-apis' 应始终是运行时范围的
  • 如果没有任何可证明的编译时引用,则像mysql-connector-java这样的服务提供程序(包含META-INF/服务的JAR文件)将被移动到运行时
  • 依赖项将移动到可能的最高源集配置。例如,“junit”被重新定位到 testCompile,除非在主源代码集中有对它的显式依赖关系(罕见)。


更新:以前的插件

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

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

其最新版本1.0.3创建于2014年12月23日。之后,没有任何更新。

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


答案 2

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

Github

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

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


推荐