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


Answers:


72

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

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


20165月, 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 apply from机制包含的Gradle脚本中定义皮棉规则。

对于多模块项目,我们建议在一个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.将依赖项重新定位为“正确”配置

  • Webjar移至运行时配置
  • 不包含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日。之后,没有任何更新。

注意:我们的许多工程师对此插件感到困惑,因为他们只更新了版本号,而没有其他任何更新。


gradle-lint-plugin是否与Android兼容?
Jaythaking

@Jaythaking是的。您可以通过以下链接:tools.android.com/tech-docs/new-build-system/…。希望它将澄清您。
SkyWalker '16

@Jaythaking-今天刚刚添加了对Android未使用依赖性的实验支持,版本为4.0.0
jkschneider

4
遗憾的是,此插件不适用于kotlin dsl。他们没有支持它的计划。
下雪

3
它也不起作用新gradle这个配置(例如:implementationapi),甚至更糟的是,建议从换新的旧过时的那些变化(如:compiletestCompile等)。
劳伦斯·贡萨尔维斯(Lawrence Gonsalves),

8

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

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

apply plugin: 'ca.cutterslade.analyze'

然后做:

$ gradle analyzeDependencies

4
我遇到此错误:“成绩同步失败:在项目中找不到名称为“ classes”的任务”
Pawan 2015年

我得到stackOverflowException这样。没有确切的信息是什么原因造成的。我认为这里可能存在循环依赖问题,但是如果工具告诉我在哪里,那将是一个好主意。
SGal 2013年

1
@Pawan这个插件不适用于Android项目,并且不会很快改变。证明:github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat

8

我使用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

3
我收到“任务':app:analyze'的执行失败。>项目未应用Java插件。” 如果我添加“ apply plugin:'java'”,则会被告知它与现有的android应用程序插件不兼容。有任何想法吗?
亚历克斯·布莱克

听起来这与Android应用程序插件有关。希望可以提供帮助,但是我没有使用Android的经验!
jstricker 2015年

该插件有错误,例如当您静态调用某个依赖项而未考虑时。
ToYonos

对于
linter


0

编者注:该答案已过期。请查看最上面的答案

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

在所有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等效于“ mvndependency:analyze”?)。


这个插件似乎是一个死项目……至少在当前的Gradle版本中。
cjstehno 2015年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.