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

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

【问题讨论】:

    标签: java maven gradle dependency-management


    【解决方案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 就是其中之一。它具有三个特定的特征。

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

    要应用规则,请添加:

    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,除非 在主源集中对其有显式依赖(很少见)。


    更新:以前的插件

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

    1. 找到未使用的依赖项、声明和传递的 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' 的任务'
    • 我得到 stackOverflowException 这样做。没有确切的信息是什么导致了这种情况。我认为这里可能存在循环依赖问题,但我的工具告诉我在哪里是个好主意。
    • @Pawan 这个插件不适用于 Android 项目,而且这不会很快改变。证明:github.com/wfhartford/gradle-dependency-analyze/issues/18
    猜你喜欢
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 2016-02-10
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    相关资源
    最近更新 更多