Cleanup your dependencies

Es gibt für Gradle ein Plugin, welches die eingebundenen Dependencies analysiert.

Um “sauber” zu arbeiten, sollten alle verwendeten Dependencies auch deklariert werden und alle nicht verwendeten Dependencies nicht unnötigerweise eingebunden werden.

Dafür muss lediglich in der build.gradle das Plugin integrieren werden:

plugins {
    id "ca.cutterslade.analyze" version "1.9.0"
}

Für ein Multimodule Projekt muss die Konfiguration etwas erweitert werden:

allprojects {
    apply plugin: "ca.cutterslade.analyze"
}

Dann kann auch schon die Analyse mit ./gradlew analyzeDependencies ausgeführt werden. Beim Verstoß gegen oben genannte Konventionen schlägt der Build fehl. Um bei Verwendung des Plugins in ein bestehendes Projekt nicht Stunden bis Tage mit dem Aufräumen der Dependencies zu verbingen, kann man auch nur eine Warnung ausgeben und den Build nicht fehlschlagen lassen. Dann hat man genügend Zeit, einmal feucht durchzuwischen (:sweat_drops:) :

tasks.named('analyzeClassesDependencies').configure {
    warnUsedUndeclared = true
    warnUnusedDeclared = true
    logDependencyInformationToFiles = true
}

tasks.named('analyzeTestClassesDependencies').configure {
    warnUsedUndeclared = true
    warnUnusedDeclared = true
    logDependencyInformationToFiles = true
}
tasks.named<AnalyzeDependenciesTask>("analyzeClassesDependencies") {
    warnUsedUndeclared = true
    warnUnusedDeclared = true
    logDependencyInformationToFiles = true
}

ttasks.named<AnalyzeDependenciesTask>('analyzeTestClassesDependencies') {
    warnUsedUndeclared = true
    warnUnusedDeclared = true
    logDependencyInformationToFiles = true
}

Beim Aufäumen kann es sein, dass man Libs, die man verwendet, nicht deklarieren möchte (weil man den Root bereits verwendet). Dann kann man mit permitTestUsedUndeclared die Fehlermeldung unterdrücken.

Im umgekehrten Fall kann es sein, dass man eine Lib deklariert, aber nicht verwendet. Dann kann man mit permitTestUnusedDeclared auch hier die Fehlermeldung unterdücken.

Auf der Readme der Pluginseite findet man noch weitere Beispiel für die Configuration.