web-dev-qa-db-ja.com

gradleで未使用の依存関係を見つける/削除する方法

私のプロジェクトで未使用の依存関係を見つけたかった。 Mavenのようなgradleでこれに何か機能はありますか?

101

更新:28-06-2016:Android未使用の依存関係のサポート

2017年6月では、4.0.0 versionおよび名前が変更されたルートプロジェクト名"gradle-lint-plugin"から"nebula-lint-plugin"。また、nused-dependencyへのAndroidサポートも追加されました。


May、2016 Gradleは、不要な依存関係を見つけて削除するために gradle lint plugin を実装しました

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

Gradle Lintプラグインは、Gradleスクリプトおよび関連ファイルの誤用または非推奨のパターンを識別および報告するための、プラグイン可能で構成可能なリンターツールです。

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

  1. 未使用の依存関係を削除します。
  2. コードで直接使用される推移的な依存関係を明示的な1次の依存関係に昇格させます。
  3. 依存関係を「正しい」構成に再配置します。

ルールを適用するには、次を追加します。

gradleLint.rules += 'unused-dependency'

nused 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'

リントするルールを定義します:

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'

このルールは、プロジェクトの source sets から発生するコンパイル済みバイナリを検査し、クラス参照を探し、 dependencies ブロックで宣言した依存関係への参照を照合します。

具体的には、ルールは依存関係に対して次の調整を行います。

1)未使用の依存関係を削除

  • Com.amazonaws:aws-Java-sdkなどのファミリースタイルのjarは、コードが含まれていないため削除されます

2)コードで直接使用される推移的な依存関係を明示的な1次依存関係に昇格します

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

)依存関係を「正しい」構成に再配置

  • 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日作成です。その後、更新はありません。

N.B:私たちのエンジニアの多くは このプラグイン について混乱しており、バージョン番号のみを更新しました。

61
SkyWalker

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
7
jstricker

以前の回答で言及されたプロジェクトは死んでいるようです。 gradle-dependency-analyze を使用します。セットアップは簡単です。

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

apply plugin: 'ca.cutterslade.analyze'

それから:

$ gradle analyzeDependencies
7

編集者注:この回答は古くなっています。上の回答をご覧ください。

com.github.nullstress.dependency-analysis gragle pluginを試すことができます

すべての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フォーラムにはスレッドがあります( "mvndependency:analyze"に相当するGradleはありますか? )。

1
EFernandes

ほとんどの歴史的な答えのプロジェクトは死んでいますが、この執筆時点で gradle-dependency-analyze は生きているようです(最後のコミットは2日前です)。

1