Verwenden von gradle zum Suchen des Abhängigkeitsbaums


542

Ist es möglich, Gradle zu verwenden, um einen Baum zu erstellen, von dem was abhängt?

Ich habe ein Projekt und möchte alle Abhängigkeiten herausfinden, damit ich es möglicherweise mit Vorwärtsdeklarationen usw. ein wenig beschneiden kann.



@OliverCharlesworth Bitte verwenden Sie die Schaltfläche Schließen, um die Antwort als Duplikat zu markieren
030

1
@ user3286701 Vielleicht könnten Sie eine der Antworten akzeptieren?
030

5
gradle dependenciessollte arbeiten. Es ist verrückt, wie jeder gradlew app:dependencieswahrscheinlich wegen Android hat.
betete

2
@prayagupd Dies sollte die Antwort sein. Die Frage ist über Gradle. Nachdem ich die hochrangigen Antworten gelesen hatte, öffnete ich das Terminal und ging in das Verzeichnis eines allgemeinen Projekts, das gradle verwendet. Ich habe 'gradle app: dependencies' ausgeführt und den Fehler 'Build failed' erhalten, obwohl ich nicht vorhatte, etwas zu erstellen. Mein Projekt funktioniert gut und ich wollte nur die Abhängigkeiten sehen.
Ka3ak

Antworten:


604

Verwenden Sie für Android diese Zeile

 gradle app:dependencies

oder wenn Sie einen Gradle Wrapper haben:

./gradlew app:dependencies

Wo appist dein Projektmodul?

Außerdem, wenn Sie möchten überprüfen , ob etwas compilegegen testCompilevs androidTestCompileAbhängigkeit als auch, was zieht es in:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>

10
Ah, ich musste den Modulnamen dort eintragen. Deshalb ... Danke!
Jenix

Ich habe gerade angefangen, Gradle zu lernen, also ein bisschen verwirrt. Kann ich gradlew als gradle behandeln, ich meine, kann ich die gleichen Optionen / Befehle wie gradle's mit gradlew eingeben?
Jenix

1
@Jenix ja, wenn Sie einen Wrapper verwenden, verwenden Sie einfach ./gradlewanstelle vongradle
Chad Bingham

2
Ich erhalte den Fehler Project 'app' not found in root projectbeim Ausführen dieser Befehle. Benjamins Lösung funktionierte jedoch.
Rock

5
In der Tat ./gradlew :dependencieswird funktionieren. Es werden die Abhängigkeiten für alle Ihre Projekte aufgelistet, aber es ist einfach, die richtige zu finden.
Dirkjot

240

Sie können den Abhängigkeitsbaum mit dem Befehl rendern gradle dependencies. Weitere Informationen finden Sie in Abschnitt 11.6.4 Auflisten der Projektabhängigkeiten im Online-Benutzerhandbuch.


2
Wenn ich dies mit meinem Android-Projekt mache, erhalte ich nur die folgende Ausgabe: pastebin.com/fHFigAuY Vorschläge?
Nilzor

3
@Nilzor Sie führen den Befehl wahrscheinlich im falschen Verzeichnis aus (das die build.gradleDatei nicht enthält ) oder Ihre Build-Datei wendet kein Plugin an.
Benjamin Muschko

6
Sie können Abhängigkeiten für ein bestimmtes Projekt mit gradle: project: dependencies
mbonnin

2
Android Studio Plugin - Gradle View zum Analysieren von Abhängigkeiten.
Jignesh Patel

3
Wenn Sie den Wrapper verwenden:./gradlew dependencies
ScrappyDev

152

Wenn Sie Schwierigkeiten haben, in der Konsolenausgabe von zu navigieren gradle dependencies, können Sie das Plugin für Projektberichte hinzufügen :

apply plugin: 'project-report'

Und generieren Sie einen HTML-Bericht mit:

$ ./gradlew htmlDependencyReport

Bericht kann normalerweise in gefunden werden build/reports/project/dependencies/index.html

Es sieht aus wie das: Geben Sie hier die Bildbeschreibung ein


2
Für mich war es nurgradle htmlDependencyReport
Richard Tingle

2
Dies funktioniert nicht für Multimodul-Projekte. Ich sehe nur eine leere Liste.
Adam Arold

1
Toller Fund. Plugin macht tatsächlich viel mehr docs.gradle.org/current/userguide/project_report_plugin.html
ruX

78

In Android Studio (mindestens seit Version 2.3.3) können Sie den Befehl direkt über die Benutzeroberfläche ausführen:

Klicken Sie auf die Registerkarte Gradle und doppelklicken Sie dann auf : Ihr Modul -> Aufgaben -> Android -> AndroidDependencies

Der Baum wird auf der Registerkarte Gradle Console angezeigt

Ein Bild sagt mehr als tausend Worte


1
Wie bekomme ich die Ansicht "Gradle-Projekte"?
user3526

1
@ user3526 Klicken Sie auf das "gradle" -Tag auf der rechten Seite Ihres Bildschirms. Schauen Sie sich das beigefügte Bild als Referenz an
Nicolás Carrasco

2
Ich habe festgestellt, dass dies eine flache Liste in AS 3.2.0 anstelle eines Baums erstellt. Die Befehlszeilenvariante erstellt jedoch einen Baum.
Tom

5
@ Tom Führen Sie die Aufgabe 'Abhängigkeiten' unter der Kategorie 'Hilfe' aus, nicht unter 'Android'. Es zeigt als Baum
Maxim Berezovsky

27

Oft ist das komplette test, compileund androidTestCompileAbhängigkeitsgraphen ist zu viel gemeinsam zu prüfen. Wenn Sie nur das compileAbhängigkeitsdiagramm möchten , können Sie Folgendes verwenden:

./gradlew app:dependencies --configuration compile

Quelle: Gradle docs Abschnitt 4.7.6

Hinweis: compileIn neueren Versionen von Gradle ist es veraltet. In neueren Versionen wird empfohlen, alle Ihre compileAbhängigkeiten auf zu verschieben implementation. Bitte sehen Sie diese Antwort hier


4
Nur eine Anmerkung: Kompilieren ist veraltet, die Leute sollten jetzt zur Implementierung
übergehen

25

Wenn Sie Ihre Abhängigkeiten in einem Diagramm visualisieren möchten, können Sie das Plugin Gradle-Dependency-Graph-Generator verwenden .

Im Allgemeinen befindet sich die Ausgabe dieses Plugins im Verzeichnis build / reports / dependency-graph und enthält drei Dateien (.dot | .png | .svg), wenn Sie die Version 0.5.0 des Plugins verwenden.

Beispiel für ein Abhängigkeitsdiagramm in einer realen App ( Schachuhr ):

Graph


Hey David, ich habe getan, was in den Plugin-Anweisungen angegeben wurde. Ich habe das Plugin in Project Gradle angewendet, sehe jedoch keinen Berichtsordner im Build-Verzeichnis. Gibt es etwas anderes zu tun, als das Projekt zu erstellen und auszuführen?
Rushi M Thakker

Dieses Plugin zeigt keine Abhängigkeitsversion und Konflikte an. so für Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual Dies macht es nutzlos ..
sytolk

18

Geben Sie dies für Android in terminal ein

gradlew app:dependencies

Es werden alle Abhängigkeiten und diejenigen mit neueren Versionen aufgelistet, die Sie gerne aktualisieren möchten

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)

15

In Gradle haben sich die Dinge weiterentwickelt, daher glaube ich, dass diese Frage eine andere Antwort verdient.
Seit Gradle 4.3 wurden " Build-Scans " eingeführt. Alle relevanten Informationen finden Sie in den Gradle-Dokumenten ( 1 , 2 ). Für mich scheint dies jetzt der einfachste Weg zu sein, Ihre Abhängigkeiten (und im Allgemeinen Ihren Build) klar und organisiert zu überprüfen.

Sie sind sehr einfach zu erstellen, führen Sie einfach aus:

gradle build --scan  

(oder ./gradlew build --scanwenn Sie einen Wrapper verwenden)

Dadurch wird ein zufällig generierter Link erstellt, über den Sie Ihren Scan sehen können. Wenn Sie diesen Link öffnen, geben Sie Ihre E-Mail-Adresse ein und erhalten die volle Kontrolle über den Link: z. Teile es oder lösche es. Es enthält viele Informationen zu Ihrem Build , nicht nur Abhängigkeiten. Sie können Ihre Abhängigkeiten, ihre Hierarchien, das Repository, mit dem sie abgerufen wurden, aber auch viele andere Dinge über Ihren Build sehen, nämlich die Leistung (die für große komplexe Builds von Interesse ist), Ihre Tests, sogar Ihre Konsolenausgabe und Ihre Systemkonfiguration, welches JDK und JVM verwendet wurde, maximale Heap-Größe usw.

Dies ist ein Druckbildschirm aus einem Scheinprojekt:

Scan-Beispiel erstellen

Ein Build-Scan ist eine gemeinsam nutzbare Aufzeichnung eines Builds, die Einblicke in das Geschehen und Warum bietet. Sie können kostenlos einen Build-Scan unter scans.gradle.com erstellen.

Beachten Sie jedoch, dass Informationen für Ihren Erstellungsprozess an die Gradle-Server gesendet werden. Sie haben die volle Kontrolle, um es zu löschen, wenn Sie mit Ihrer Inspektion fertig sind.

Schließlich können Sie auch Build-Scans mit Gradle-Versionen vor 4.3 verwenden. Sie müssen lediglich das Scans-Plugin manuell in Ihr Buildscript einfügen.

Bearbeiten :
Einige Rückmeldungen aus den Kommentaren enthalten einige zusätzliche Hinweise:
1) Es ist sehr schwierig, dies versehentlich oder ohne Verständnis dafür zu tun, dass einige Informationen für Ihren Build online sind (privat für Sie, mit der Möglichkeit, sie zu löschen, aber immer noch online) ).

Bei der Ausführung gradle build --scanerscheint folgende Meldung:

Publishing a build scan to scans.gradle.com requires accepting the Gradle
Terms of Service defined at https://gradle.com/terms-of-service. Do you
accept these terms? [yes, no]

Sie müssen explizit schreiben yesund dann geht die Nachricht weiter:

Publishing build scan...  
https://gradle.com/s/a12en0dasdu

2) In Gradle Enterprise können Sie Gradle-Build-Scans auf Ihren eigenen Servern hosten. Ich habe jedoch keine Erfahrung damit und mein vorgeschlagener Ansatz betraf die Standard-Gradle-Verteilung, bei der Gradles Server für Ihre Build-Scans verwendet wurden.

3) Gradle selbst fördert die Build-Scans, um die meisten Build-Probleme zu lösen.


11
Es tut uns leid, die Antwort abgelehnt zu haben, aber IMO beantwortet sie die Frage nicht und warnt nicht klar genug, dass gradle build --scanSie Details Ihres Builds irgendwo im Internet veröffentlichen - und um sie zu löschen, müssen Sie sie mit der funktionierenden E-Mail-Adresse verknüpfen.
Michal

1
Hey Michal, du kannst gerne abstimmen, wenn du so denkst. Wie auch immer, ich muss fragen, hast du es versucht? Bei der Ausführung gradle build --scanin cmd werden Sie aufgefordert : Publishing a build scan to scans.gradle.com requires accepting the Gradle Terms of Service defined at https://gradle.com/terms-of-service. Do you accept these terms? [yes, no]. Sie müssen manuell schreiben yes. Kurz danach erhalten Sie die Nachricht: Publishing build scan... https://gradle.com/s/a12en0dasdu(zufällig platzierten Link des gleichen Typs). Ich glaube, es warnt Sie vorher angemessen. (1/2)
Tryman

1
Sie können den Link besuchen und den Scan sofort löschen, ohne eine E-Mail oder etwas anderes. Als Antwort glaube ich, dass es die Frage beantwortet . Tatsächlich werden Ihnen im Vergleich zu anderen Ansätzen zusätzliche Informationen zu Ihren Abhängigkeiten angezeigt (und die Extrameile: zusätzliche Informationen auch für den gesamten Build). Wenn Sie es nicht nach Ihren Wünschen finden, ist das völlig in Ordnung, aber es ist (meines Wissens) das derzeit umfassendste Werkzeug für den Job, daher ist es wertvoll, es im Auge zu behalten. Schließlich wird es von Gradle selbst beworben, es ist buchstäblich ihr erster Führer (2/2)
Tryman

@Michal Entschuldigung, ich habe vergessen, dich vorher zu markieren, sodass du meine Kommentare möglicherweise nicht gesehen hast. (Ich habe den Beitrag auch bearbeitet, um die Kommentare aufzunehmen, mit denen ich Ihnen geantwortet habe.)
Tryman

2
Ich habe das nicht versucht - danke für die Klarstellung über das Akzeptieren von Bedingungen. Ich habe meine -1 entfernt.
Michal

9

In Android Studio

1) Öffnen Sie das Terminal und stellen Sie sicher, dass Sie sich im Stammordner des Projekts befinden.

2) Ausführen ./gradlew app:dependencies (wenn Sie keinen Gradle Wrapper verwenden, versuchen Sie es gradle app:dependencies)

Beachten Sie, dass beim Ausführen ./gradle dependenciesnur der Abhängigkeitsbaum des Stammordners des Projekts angezeigt wird. Daher ./gradlew app:dependenciesist es wichtig , die App wie oben erwähnt zu erwähnen .


1
bei mir hat es ohne das "./" geklappt, so: gradlew app: abhängigkeiten.
Gilad Levinson

7

Ich fand es auch nützlich, dies auszuführen:

./gradlew dI --dependency <your library>

Dies zeigt, wie Abhängigkeiten aufgelöst werden ( dependencyInsight) und hilft Ihnen beim Debuggen, wo Sie Bibliotheken in Ihrem Computer erzwingen oder ausschließen müssenbuild.gradle

Siehe: https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html


Ich versuche dies wie du sagst, aber es hat nicht funktioniert :( stackoverflow.com/questions/49646103/…
loki

7

Beachten Sie, dass Sie möglicherweise etwas tun müssen, ./gradlew <module_directory>:<module_name>:dependencieswenn das Modul über ein zusätzliches Verzeichnis verfügt, bevor Sie das build.gradle erreichen. ./gradlew tasks --allÜberprüfen Sie im Zweifelsfall den Namen.


7

Für mich war es einfach ein Befehl

in build.gradle hinzufügen plugin

apply plugin: 'project-report'

Gehen Sie dann zu cmd und führen Sie den folgenden Befehl aus

./gradlew htmlDependencyReport

Dies gibt mir einen HTML-Bericht WOW HTML-Bericht 💕

Das ist alles mein Herr.


Dies wurde bereits von Devstr beantwortet.
brute_force

Ja, danke @brute_force Zu diesem Zeitpunkt war es für mich nicht sichtbar. Was willst du, entferne meine Antwort?
Dupinder Singh

1

Für neuere Versionen von Gradle (ich habe mit der Version 6.4.1 getestet):

gradle dependencies --configuration compileClasspath

oder wenn Sie den Gradle Wrapper verwenden:

gradlew dependencies --configuration compileClasspath

0

Wenn Sie alle Abhängigkeiten in einer einzigen Datei am Ende in zwei Schritten haben möchten. Fügen Sie dies zu Ihrem build.gradle.ktsim Stammverzeichnis Ihres Projekts hinzu:

project.rootProject.allprojects {
    apply(plugin="project-report")

    this.task("allDependencies", DependencyReportTask::class) {
        evaluationDependsOnChildren()
        this.setRenderer(AsciiDependencyReportRenderer())
    }

}

Dann bewerben Sie sich:

./gradlew allDependencies | grep '\-\-\-' | grep -Po '\w+.*$' | awk -F ' ' '{ print $1 }' | sort | grep -v '\{' | grep -v '\[' | uniq | grep '.\+:.\+:.\+'

Dadurch erhalten Sie alle Abhängigkeiten in Ihrem Projekt und Ihren Unterprojekten sowie alle Abhängigkeiten von Drittanbietern.

Wenn Sie dies programmgesteuert erledigen möchten, benötigen Sie einen benutzerdefinierten Renderer für die Abhängigkeiten. Sie können zunächst den Renderer erweitern, der AsciiDependencyReportRendererstandardmäßig ein ASCII-Diagramm der Abhängigkeiten druckt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.