Gradleで未使用の依存関係を検索/削除する方法


回答:


72

更新:2016年6月28日:未使用の依存関係に対するAndroidのサポート

20176月、彼らはをリリースし4.0.0 version 、ルートプロジェクト名"gradle-lint-plugin"をに変更しました "nebula-lint-plugin"。また、未使用の依存関係にAndroidのサポートを追加しました。


20165月、 Gradleは不要な依存関係を見つけて削除するためのGradle lintプラグインを実装しました

Gradle Lintプラグイン:完全なドキュメント

Gradle Lintプラグインは、Gradleスクリプトと関連ファイルの誤用や非推奨のパターンを識別してレポートするための、プラグイン可能な構成可能なリンターツールです。

このプラグインにはさまざまなルールがあります。未使用の依存関係ルールもその1つです。これには3つの特徴があります。

  1. 未使用の依存関係を削除します。
  2. コードで直接使用される推移的な依存関係を、明示的な1次依存関係に昇格させます。
  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スクリプトで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.コードで直接使用される推移的な依存関係を昇格させ、一次依存関係を明示します。

  • これには、com.amazonaws:aws-java-sdkなどのファミリースタイルのJARファイルを実際に使用している部分に分割し、それらを一次依存関係として追加するという副作用があります。

3.依存関係を「正しい」構成に再配置します

  • Webjarはランタイム構成に移動されます
  • META-INF外のクラスコンテンツを含まないJARファイルはランタイムに移動されます
  • 「xerces」、「xercesImpl」、「xml-apis」は常にランタイムスコープにする必要があります
  • mysql-connector-javaなどのサービスプロバイダー(META-INF / servicesを含むJARファイル)は、検証可能なコンパイル時参照がない場合、ランタイムに移動されます。
  • 依存関係は、可能な限り最高のソースセット構成に移動されます。たとえば、メインソースセット内で明示的な依存関係がない限り、「junit」はtestCompileに再配置されます(まれです)。


更新:以前のプラグイン

あなたの親切な情報のために、私は以前のプラグインについて共有したいと思います

  1. 宣言された推移的な未使用の依存関係を見つけるGradleプラグインは、com.github.nullstress.dependency-analysisです。

しかし、その最新バージョン1.0.3は2014年12月23日に作成されました。その後は更新はありません。

注意:バージョン番号のみを更新しているため、エンジニアの多くはこのプラグインについて混乱しています。


gradle-lint-pluginはAndroidと互換性がありますか?
ジェイサキング

@Jaythakingはい。このリンクにアクセスできます:tools.android.com/tech-docs/new-build-system/…。それがあなたを明確にすることを願っています。
SkyWalker 2016年

@Jaythaking-バージョン4.0.0で本日Android未使用の依存関係の実験的サポートを追加しました
jkschneider

4
このプラグインは残念ながらkotlin dslでは動作しません。彼らはそれをサポートする計画はありません。
雪が降る

3
また、新しいGradleの構成で仕事をしません(例:implementationapi)、そしてさらに悪いことに、古い非推奨のものと新しいものから変更することをおすすめします(例:compiletestCompileなど)。
Laurence 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
私はこのエラーに直面しています: 'Gradle sync failed:Task with name' classes 'not found in project'
Pawan

私はそれをしているstackOverflowExceptionを得ます。しかし、これを引き起こしている正確な情報はありません。ここで循環依存関係の問題があるかもしれませんが、ツールが私にどこに言ったかは素晴らしい考えでしょう。
SGal 2016年

1
@PawanこのプラグインはAndroidプロジェクトでは機能せず、すぐに変更される予定はありません。証明:github.com/wfhartford/gradle-dependency-analyze/issues/18
diesersamat

8

Gradle Dependency Analysis Pluginを使用して多くの幸運を手に入れました。はじめに、Gradleビルドスクリプトに次の2つを追加します。

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

プラグインにはバグがあります。たとえば、依存関係への静的呼び出しがあり、考慮されていない場合などです。
ToYonos 2015

これはlinterプラグインでは非推奨のようです
Ruthi Ruth


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フォーラムにはスレッド(「mvn dependency:analyze」に相当するGradleはありますか?)があります。


このプラグインは死んだプロジェクトのようです...少なくとも現在のGradleバージョンでは。
cjstehno 2015

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.