So finden / entfernen Sie nicht verwendete Abhängigkeiten in Gradle

128

Ich wollte unbenutzte Abhängigkeiten in meinem Projekt finden. Gibt es dafür in Gradle eine Funktion wie in Maven?

Alexander Bezrodniy
quelle

Antworten:

72

UPDATE: 28-06-2016: Android-Unterstützung für nicht verwendete Abhängigkeiten

Im Juni 2017 haben sie das veröffentlicht 4.0.0 version und den Namen des Stammprojekts "gradle-lint-plugin"in umbenannt "nebula-lint-plugin". Sie haben auch Android-Unterstützung für nicht verwendete Abhängigkeiten hinzugefügt .


Im Mai 2016 hat Gradle das Gradle-Flusen-Plugin implementiert , um unerwünschte Abhängigkeiten zu finden und zu entfernen

Gradle Lint Plugin: Vollständige Dokumentation

Das Gradle Lint-Plugin ist ein steckbares und konfigurierbares Linter-Tool zum Identifizieren und Melden von Missbrauchs- oder Verfallsmustern in Gradle-Skripten und verwandten Dateien.

Dieses Plugin hat verschiedene Regeln. Die nicht verwendete Abhängigkeitsregel ist eine davon. Es hat drei spezifische Eigenschaften.

  1. Entfernt nicht verwendete Abhängigkeiten.
  2. Fördert transitive Abhängigkeiten, die direkt von Ihrem Code verwendet werden, um Abhängigkeiten erster Ordnung zu explizieren.
  3. Verschiebt Abhängigkeiten in die 'richtige' Konfiguration.

Fügen Sie zum Anwenden der Regel Folgendes hinzu:

gradleLint.rules += 'unused-dependency'

Details zur nicht verwendeten Abhängigkeitsregel finden Sie im letzten Teil.

So wenden Sie das Gradle Lint Plugin an:

buildscript { repositories { jcenter() } }
plugins {
  id 'nebula.lint' version '0.30.2'
}

Alternative:

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

apply plugin: 'nebula.lint'

Definieren Sie, gegen welche Regeln Sie fusseln möchten:

gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like

Für einen Enterprise-Build empfehlen wir, die Flusenregeln in einem init.gradle-Skript oder in einem Gradle-Skript zu definieren, das über den Gradle-Apply-from-Mechanismus enthalten ist.

Für Multimodul-Projekte empfehlen wir, das Plugin in einem allprojectsBlock anzuwenden :

allprojects {
  apply plugin: 'nebula.lint'
  gradleLint.rules = ['all-dependency'] // Add as many rules here as you'd like
}


Einzelheiten zur nicht verwendeten Abhängigkeitsregel finden Sie in diesem Teil

Fügen Sie zum Anwenden der Regel Folgendes hinzu:

gradleLint.rules += 'unused-dependency'

Die Regel überprüft kompilierte Binärdateien, die aus den Quellensätzen Ihres Projekts stammen, nach Klassenreferenzen und vergleicht diese Referenzen mit den Abhängigkeiten, die Sie in Ihren Abhängigkeiten deklariert haben .

Insbesondere nimmt die Regel die folgenden Anpassungen an Abhängigkeiten vor:

1. Entfernt nicht verwendete Abhängigkeiten

  • Jars im Familienstil wie com.amazonaws: aws-java-sdk werden entfernt, da sie keinen Code enthalten

2. Fördert transitive Abhängigkeiten, die direkt von Ihrem Code verwendet werden, um Abhängigkeiten erster Ordnung zu explizieren

  • Dies hat den Nebeneffekt, dass JAR-Dateien im Familienstil wie com.amazonaws: aws-java-sdk in die Teile aufgeteilt werden, die Sie tatsächlich verwenden, und diese als Abhängigkeiten erster Ordnung hinzufügen

3. Verschiebt Abhängigkeiten in die 'richtige' Konfiguration

  • Webjars werden in die Laufzeitkonfiguration verschoben
  • JAR-Dateien, die keine Klassen und Inhalte außerhalb von META-INF enthalten, werden zur Laufzeit verschoben
  • 'xerces', 'xercesImpl', 'xml-apis' sollten immer einen Laufzeitbereich haben
  • Dienstanbieter (JAR-Dateien, die META-INF / Dienste enthalten) wie mysql-connector-java werden zur Laufzeit verschoben, wenn keine nachweisbare Referenz zur Kompilierungszeit vorhanden ist
  • Abhängigkeiten werden in die höchstmögliche Quellensatzkonfiguration verschoben. Beispielsweise wird 'junit' nach testCompile verschoben, es sei denn, es besteht eine explizite Abhängigkeit davon im Hauptquellensatz (selten).


UPDATE: Vorherige Plugins

Zu Ihrer Information möchte ich über frühere Plugins berichten

  1. Das Gradle-Plugin, das deklarierte und transitive nicht verwendete Abhängigkeiten findet, ist com.github.nullstress.dependency-analysis

Die neueste Version 1.0.3 wurde jedoch am 23. Dezember 2014 erstellt . Danach gibt es keine Updates mehr.

NB: Viele unserer Ingenieure sind verwirrt über dieses Plugin, da sie nur die Versionsnummer aktualisiert haben, sonst nichts.

SkyWalker
quelle
Ist das Gradle-Lint-Plugin mit Android kompatibel?
Jaythaking
@ Jaythaking ja. Sie können über diesen Link gehen: tools.android.com/tech-docs/new-build-system/… . Hoffe es wird dich klarstellen.
SkyWalker
@ Jaythaking - gerade experimentelle Unterstützung für Android unbenutzte Abhängigkeiten heute mit Version 4.0.0
hinzugefügt
4
Dieses Plugin funktioniert leider nicht mit dem Kotlin DSL. Sie haben keine Pläne, es zu unterstützen.
Schnee
3
Es ist auch nicht die Arbeit mit den neuen gradle Konfigurationen (zB: implementationund api), und noch schlimmer, empfiehlt von den neuen zu den alten veralteten diejenigen zu ändern (zB: compile, testCompile, etc.).
Laurence Gonsalves
8

Ich hatte viel Glück mit dem Gradle Dependency Analysis Plugin . Fügen Sie Ihrem Gradle-Build-Skript die folgenden zwei Dinge hinzu, um damit zu beginnen.

buildscript {
    repositories {
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
    }
}

und

apply plugin: "dependencyAnalysis"

Sobald diese vorhanden sind, führen Sie sie aus gradle analyze. Wenn nicht verwendete Abhängigkeiten vorhanden sind, wird ein Erstellungsfehler angezeigt, der eine Ausgabe ähnlich dem folgenden Text sowie eine Liste der nicht verwendeten Abhängigkeiten (sowohl deklariert als auch transitiv) anzeigt. Der Build-Fehler ist sehr praktisch, wenn Sie erzwingen möchten, dass über einen CI-Build keine nicht verwendeten Abhängigkeiten vorhanden sind.

:foo:analyze FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':foo:analyze'.
> The project has unused declared artifacts
jstricker
quelle
3
Ich erhalte die Meldung "Ausführung für Aufgabe ': app: analyse' fehlgeschlagen.> Für das Projekt ist das Java-Plugin nicht angewendet." Wenn ich "Plugin anwenden: 'Java'" hinzufüge, wird mir mitgeteilt, dass es nicht mit dem vorhandenen Plugin für Android-Anwendungen kompatibel ist. irgendwelche Ideen?
Alex Black
Es klingt wie etwas Spezielles mit dem Android-Anwendungs-Plugin. Ich wünschte, ich könnte helfen, aber ich habe keine Erfahrung mit Android!
Jstricker
Das Plugin weist Fehler auf, z. B. wenn Sie einen statischen Aufruf einer Abhängigkeit haben, der nicht berücksichtigt wird.
ToYonos
Dies scheint für das Linter-Plugin veraltet zu sein
Ruthi Ruth
7

Das in den früheren Antworten erwähnte Projekt scheint tot zu sein. Ich benutze Gradle-Abhängigkeits-Analyse . Die Einrichtung ist einfach:

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

apply plugin: 'ca.cutterslade.analyze'

Dann mach:

$ gradle analyzeDependencies
Subhash Chandran
quelle
4
Ich habe diesen Fehler: 'Gradle-Synchronisierung fehlgeschlagen: Aufgabe mit dem Namen' Klassen 'nicht im Projekt gefunden'
Pawan
Ich bekomme die stackOverflowException, die das macht. Keine genauen Informationen, was dies verursacht. Ich denke, dass es hier ein zirkuläres Abhängigkeitsproblem geben könnte, aber es wäre eine großartige Idee, wenn das Tool mir sagen würde, wo.
SGal
1
@Pawan Dieses Plugin funktioniert nicht mit Android-Projekten und dies wird sich nicht so schnell ändern. Beweis: github.com/wfhartford/gradle-dependency-analyze/issues/18
Diesersamat
0

Anmerkung des Herausgebers: Diese Antwort ist veraltet. Bitte sehen Sie die Top-Antwort .

Sie können das Gradle-Plugin com.github.nullstress.dependency-analysis ausprobieren

Erstellen Sie ein Skript-Snippet zur Verwendung in allen Gradle-Versionen:

buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "com.github.nullstress:DependencyAnalysisPlugin:1.0.3"
  }
}

apply plugin: "com.github.nullstress.dependency-analysis"

Erstellen Sie ein Skript-Snippet für einen neuen, inkubierenden Plugin-Mechanismus, der in Gradle 2.1 eingeführt wurde:

plugins {
  id "com.github.nullstress.dependency-analysis" version "1.0.3"
}

Außerdem gibt es im Gradle-Forum einen Thread ( Gibt es ein Gradle-Äquivalent zu "mvn-Abhängigkeit: analysieren"? ).

EFernandes
quelle
Dieses Plugin scheint ein totes Projekt zu sein ... zumindest mit der aktuellen Gradle-Version.
cjstehno
0

Die Projekte zu den meisten historischen Antworten sind tot, aber die Gradle-Abhängigkeitsanalyse scheint ab dem 30.05.2016 noch am Leben zu sein.

Brandon McKenzie
quelle
Ich sehe, dass sie vor ein paar Wochen Änderungen an Nebula-Lint vorgenommen haben.
Erbaut in Parris