如何在gradle中找到\删除未使用的依赖项

Ale*_*niy 106 java dependency-management gradle maven

我想在我的项目中找到未使用的依赖项.像maven一样,在Gradle中是否有任何功能?

Sky*_*ker 62

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

2017年六月,他们已经发布了4.0.0 version ,并更名为根项目名称"gradle-lint-plugin""nebula-lint-plugin".他们还为未使用的依赖添加了Android支持.


20165月, Gradle实施了gradle lint插件,用于查找和删除不需要的依赖项

Gradle Lint插件:完整文档

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

这个插件有各种规则.未使用的依赖规则就是其中之一.它有3个特定的特征.

  1. 删除未使用的依赖项.
  2. 将代码直接使用的传递依赖项提升为显式的第一顺序依赖项.
  3. 将依赖项重定位到"正确"配置.

要应用规则,请添加:

gradleLint.rules += 'unused-dependency'
Run Code Online (Sandbox Code Playgroud)

最后部分给出了未使用依赖关系规则的详细信息.

要应用gradle lint插件:

buildscript { repositories { jcenter() } }
plugins {
  id 'nebula.lint' version '0.30.2'
}
Run Code Online (Sandbox Code Playgroud)

或者:

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

apply plugin: 'nebula.lint'
Run Code Online (Sandbox Code Playgroud)

定义您要对哪些规则进行处理:

gradleLint.rules = ['all-dependency'] // add as many rules here as you'd like
Run Code Online (Sandbox Code Playgroud)

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

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

allprojects {
  apply plugin: 'nebula.lint'
  gradleLint.rules = ['all-dependency'] // add as many rules here as you'd like
}
Run Code Online (Sandbox Code Playgroud)

本部分给出了未使用依赖关系规则的详细信息

要应用规则,请添加:

gradleLint.rules += 'unused-dependency'
Run Code Online (Sandbox Code Playgroud)

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

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

1)删除未使用的依赖项

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

2)提升代码直接使用的传递依赖关系到显式的第一顺序依赖关系

  • 这有一个副作用,就是将com.amazonaws:aws-java-sdk等家族风格的jar分解为你实际使用的部分,并将它们作为一阶依赖项添加

3)将依赖项重定位到"正确"配置

  • Webjars被移动到运行时配置
  • 不包含META-INF之外的类和内容的jar将移动到运行时
  • 'xerces','xercesImpl','xml-apis'应该始终是运行时作用域
  • 如果没有可证明的编译时引用,则将服务提供者(包含META-INF/services的jar)(如mysql-connector-java)移动到运行时
  • 依赖关系可以移动到最高源集配置.例如,'junit'被重定位到testCompile,除非在主源集中存在明显的依赖关系(罕见).


更新:以前的插件

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

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

它的最新版本1.0.3创建于2014年12月23日.之后没有更新.

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

  • 遗憾的是,此插件不适用于kotlin dsl。他们没有支持它的计划。 (4认同)
  • 它也不适用于新的 gradle 配置(例如:`implementation` 和 `api`),更糟糕的是,建议将新配置更改为已弃用的旧配置(例如:`compile`、`testCompile` 等) .) (4认同)
  • `gradle-lint-plugin` 或 nebula-plugin 不适用于 Android 项目,(来源)[https://github.com/nebula-plugins/gradle-lint-plugin/issues/36#issuecomment-884790846] (2认同)

jst*_*ker 7

我使用Gradle依赖性分析插件有很多运气.要开始使用它,请将以下两项内容添加到Gradle构建脚本中.

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
    }
}
Run Code Online (Sandbox Code Playgroud)

apply plugin: "dependencyAnalysis"
Run Code Online (Sandbox Code Playgroud)

一旦到位,运行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
Run Code Online (Sandbox Code Playgroud)

  • 我收到“任务 ':app:analyze' 的执行失败。> 项目没有应用 Java 插件。” 如果我添加“apply plugin: 'java'”,那么我会被告知它与现有的 android 应用程序插件不兼容。有任何想法吗? (3认同)

Sub*_*ran 7

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

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

apply plugin: 'ca.cutterslade.analyze'
Run Code Online (Sandbox Code Playgroud)

然后做:

$ gradle analyzeDependencies
Run Code Online (Sandbox Code Playgroud)

  • 我正面临这样的错误:'Gradle sync failed:在项目中找不到名为'classes'的任务' (4认同)
  • @Pawan 这个插件不适用于 Android 项目,而且这一点不会很快改变。证明:https://github.com/wfhartford/gradle-dependency-analyze/issues/18 (2认同)

ssc*_*ass 5

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

GitHub

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

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

  • 我会选择这个,我得到了更好的结果,谢谢 (3认同)
  • 可以确认的是,这个非常出色,并且与其他版本不同,它也适用于基于 kotlin 的 gradle 文件。 (2认同)

EFe*_*des 1

编者注:这个答案已经过时了。请参阅最上面的答案

您可以尝试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"
Run Code Online (Sandbox Code Playgroud)

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

plugins {
  id "com.github.nullstress.dependency-analysis" version "1.0.3"
}
Run Code Online (Sandbox Code Playgroud)

另外, Gradle 论坛中有一个关于此问题的主题(Is there a Gradle相当于“mvn dependency:analyze”? )。