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:
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.
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
@ 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:
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
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 ):
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?
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:
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:
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.
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 .
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
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.
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:
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.
gradle dependencies
sollte arbeiten. Es ist verrückt, wie jedergradlew app:dependencies
wahrscheinlich wegen Android hat.Antworten:
Verwenden Sie für Android diese Zeile
oder wenn Sie einen Gradle Wrapper haben:
Wo
app
ist dein Projektmodul?Außerdem, wenn Sie möchten überprüfen , ob etwas
compile
gegentestCompile
vsandroidTestCompile
Abhängigkeit als auch, was zieht es in:quelle
./gradlew
anstelle vongradle
Project 'app' not found in root project
beim Ausführen dieser Befehle. Benjamins Lösung funktionierte jedoch../gradlew :dependencies
wird funktionieren. Es werden die Abhängigkeiten für alle Ihre Projekte aufgelistet, aber es ist einfach, die richtige zu finden.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.quelle
build.gradle
Datei nicht enthält ) oder Ihre Build-Datei wendet kein Plugin an../gradlew dependencies
Wenn Sie Schwierigkeiten haben, in der Konsolenausgabe von zu navigieren
gradle dependencies
, können Sie das Plugin für Projektberichte hinzufügen :Und generieren Sie einen HTML-Bericht mit:
Bericht kann normalerweise in gefunden werden
build/reports/project/dependencies/index.html
Es sieht aus wie das:
quelle
gradle htmlDependencyReport
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
quelle
Oft ist das komplette
test
,compile
undandroidTestCompile
Abhängigkeitsgraphen ist zu viel gemeinsam zu prüfen. Wenn Sie nur dascompile
Abhängigkeitsdiagramm möchten , können Sie Folgendes verwenden:Quelle: Gradle docs Abschnitt 4.7.6
Hinweis:
compile
In neueren Versionen von Gradle ist es veraltet. In neueren Versionen wird empfohlen, alle Ihrecompile
Abhängigkeiten auf zu verschiebenimplementation
. Bitte sehen Sie diese Antwort hierquelle
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 ):
quelle
Geben Sie dies für Android in terminal ein
Es werden alle Abhängigkeiten und diejenigen mit neueren Versionen aufgelistet, die Sie gerne aktualisieren möchten
quelle
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:
(oder
./gradlew build --scan
wenn 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:
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 --scan
erscheint folgende Meldung:Sie müssen explizit schreiben
yes
und dann geht die Nachricht weiter: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.
quelle
gradle build --scan
Sie 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.gradle build --scan
in 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 schreibenyes
. 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)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 esgradle app:dependencies
)Beachten Sie, dass beim Ausführen
./gradle dependencies
nur der Abhängigkeitsbaum des Stammordners des Projekts angezeigt wird. Daher./gradlew app:dependencies
ist es wichtig , die App wie oben erwähnt zu erwähnen .quelle
Ich fand es auch nützlich, dies auszuführen:
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
quelle
Beachten Sie, dass Sie möglicherweise etwas tun müssen,
./gradlew <module_directory>:<module_name>:dependencies
wenn 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.quelle
Für mich war es einfach ein Befehl
in build.gradle hinzufügen
plugin
Gehen Sie dann zu cmd und führen Sie den folgenden Befehl aus
Dies gibt mir einen HTML-Bericht WOW HTML-Bericht 💕
Das ist alles mein Herr.
quelle
Für neuere Versionen von Gradle (ich habe mit der Version 6.4.1 getestet):
oder wenn Sie den Gradle Wrapper verwenden:
quelle
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.kts
im Stammverzeichnis Ihres Projekts hinzu:Dann bewerben Sie sich:
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
AsciiDependencyReportRenderer
standardmäßig ein ASCII-Diagramm der Abhängigkeiten druckt.quelle