I wanted to find unused dependencies in my project. Is there a feature for this in Gradle, like in Maven?
6 に答える
更新: 2016 年 6 月 28 日: Android の unused-dependency のサポート
2017年6 月に をリリースし
4.0.0 version
、ルート プロジェクト名"gradle-lint-plugin"
を に 変更しました"nebula-lint-plugin"
。また、unused-dependency に Android サポートを追加しました。
2016年5 月、Gradle は不要な依存関係を見つけて削除するためのGradle lint プラグインを実装しました。
Gradle Lint プラグイン: 完全なドキュメント
Gradle Lint プラグインは、Gradle スクリプトおよび関連ファイルの誤用または非推奨のパターンを特定して報告するための、プラグ可能で構成可能なリンター ツールです。
このプラグインにはさまざまなルールがあります。Unused Dependency Ruleもその 1 つです。それには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
エンタープライズ ビルドの場合、lint ルールを 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
}
Unused Dependency Ruleの詳細については、この部分で説明します。
ルールを適用するには、次を追加します。
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 に再配置されます (まれです)。
更新: 以前のプラグイン
親切な情報として、以前のプラグインについて共有したいと思います
- 未使用の依存関係、宣言された推移的な依存関係を見つける Gradle プラグインはcom.github.nullstress.dependency-analysis です。
しかし、その最新バージョン 1.0.3 は 2014 年 12 月 23 日に作成されました。その後、更新はありません。
注意: 多くのエンジニアは、バージョン番号だけを更新しただけで、他には何も更新していないため、このプラグインについて混乱しています。
以前の回答で言及されたプロジェクトは死んでいるようです。私は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 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
歴史的な回答のほとんどに関するプロジェクトは終了していますが、gradle-dependency-analyzeは 2016-05-30 の時点で生きているようです。