Używanie gradla do znalezienia drzewa zależności

542

Czy można użyć gradacji do stworzenia drzewa tego, co zależy od czego?

Mam projekt i chciałbym dowiedzieć się o wszystkich zależnościach, więc może będę mógł go trochę przyciąć za pomocą deklaracji przesyłania dalej itp.

użytkownik3286701
źródło
4
możliwy duplikat polecenia graficznego zależności zależności stopnia?
Oliver Charlesworth
@OliverCharlesworth proszę użyć przycisku zamykania, aby zaznaczyć odpowiedź jako duplikat
030
1
@ user3286701 być może mógłbyś zaakceptować jedną z odpowiedzi?
030
5
gradle dependenciespowinno działać. To szalone, że każdy ma gradlew app:dependenciesprawdopodobnie dlatego, że Android.
prayagupd
2
@prayagupd To powinna być odpowiedź. Pytanie dotyczy stopnia. Po przeczytaniu wysoko ocenianych odpowiedzi otworzyłem terminal i zapisałem cd do katalogu ogólnego projektu korzystającego z gradle. Wykonałem „gradle app: dependencies” i dostałem błąd „Kompilacja nieudana”, chociaż nie planowałem niczego budować. Mój projekt działa dobrze i chciałem tylko zobaczyć zależności.
ka3ak

Odpowiedzi:

604

W przypadku systemu Android użyj tej linii

 gradle app:dependencies

lub jeśli masz opakowanie stopniowe:

./gradlew app:dependencies

gdzie appjest moduł twojego projektu.

Dodatkowo, jeśli chcesz sprawdzić, czy coś jest compilew porównaniu testCompilevs androidTestCompileuzależnienia, a także, co ciągnie go w:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>
Chad Bingham
źródło
10
Ach, musiałem tam wpisać nazwę modułu. Właśnie dlatego ... Dzięki!
Jenix
Właśnie zaczął studiować teraz stopień, więc trochę zmieszany. Czy mogę traktować gradlew jako grad, to znaczy, czy mogę wprowadzić takie same opcje / polecenia jak gradle z gradlew?
Jenix
1
@Jenix tak, jeśli używasz owijarki, po prostu użyj ./gradlewzamiastgradle
Chad Bingham
2
Project 'app' not found in root projectPodczas uruchamiania tych poleceń pojawia się błąd . Jednak rozwiązanie Benjaminy działało.
krock,
5
W rzeczywistości ./gradlew :dependencieszadziała. Wyświetli listę zależności dla wszystkich twoich projektów, ale łatwo jest znaleźć właściwy.
dirkjot
240

Możesz renderować drzewo zależności za pomocą polecenia gradle dependencies. Aby uzyskać więcej informacji, zapoznaj się z sekcją 11.6.4 Wyświetlanie zależności projektu od elektronicznego przewodnika użytkownika.

Benjamin Muschko
źródło
2
Gdy robię to z moim projektem dla Androida, otrzymuję tylko ten wynik: pastebin.com/fHFigAuY Sugestie?
Nilzor,
3
@Nilzor Prawdopodobnie wykonujesz polecenie w niewłaściwym katalogu (który nie zawiera build.gradlepliku) lub plik kompilacji nie stosuje żadnej wtyczki.
Benjamin Muschko
6
możesz uzyskać zależności dla konkretnego projektu za pomocą gradle: project: dependencies
mbonnin
2
Wtyczka Android Studio - Gradle View do analizy zależności.
Jignesh Patel
3
Jeśli używasz opakowania:./gradlew dependencies
ScrappyDev
152

Jeśli trudno ci nawigować po wynikach konsoli gradle dependencies, możesz dodać wtyczkę Raporty projektu :

apply plugin: 'project-report'

I wygeneruj raport HTML za pomocą:

$ ./gradlew htmlDependencyReport

Raport można zwykle znaleźć w build/reports/project/dependencies/index.html

To wygląda tak: wprowadź opis zdjęcia tutaj

Devstr
źródło
2
Dla mnie to był po prostugradle htmlDependencyReport
Richard Tingle
2
To nie działa w przypadku projektów wielomodułowych. Po prostu widzę i pustą listę.
Adam Arold,
1
Świetne znalezisko. Wtyczka faktycznie robi znacznie więcej docs.gradle.org/current/userguide/project_report_plugin.html
ruX
78

W Android Studio (przynajmniej od wersji 2.3.3) możesz uruchomić polecenie bezpośrednio z interfejsu użytkownika:

Kliknij kartę Gradle , a następnie kliknij dwukrotnie : twój moduł -> Zadania -> android -> androidDependencies

Drzewo zostanie wyświetlone na karcie Konsola gradientu

Obraz jest wart tysiąca słów

Nicolás Carrasco
źródło
1
jak uzyskać widok „projektów stopniowych”?
user3526,
1
@ user3526 kliknij znacznik „gradle” znajdujący się po prawej stronie ekranu. Spójrz na załączony obraz w celach informacyjnych
Nicolás Carrasco,
2
Odkryłem, że tworzy to płaską listę w AS 3.2.0, zamiast drzewa. Jednak wariant wiersza poleceń tworzy drzewo.
Tom
5
@Tom uruchom zadanie „zależności” w kategorii „pomoc”, a nie „android”. Pokazuje się jako drzewo
Maxim Berezowski
27

Często pełna test, compilei androidTestCompilewykres zależność jest zbyt wiele, aby rozpatrzyć łącznie. Jeśli chcesz tylko compilewykres zależności, możesz użyć:

./gradlew app:dependencies --configuration compile

Źródło: Gradle docs sekcja 4.7.6

Uwaga: compilezostał wycofany w nowszych wersjach programu Gradle, aw nowszych wersjach zaleca się przeniesienie wszystkich compilezależności na implementation. Zobacz tę odpowiedź tutaj

David Rawson
źródło
4
tylko uwaga: kompilacja jest przestarzała, ludzie powinni teraz przejść do implementacji
reinaldomoreira
25

Jeśli chcesz wizualizować swoje zależności na wykresie, możesz użyć wtyczki generatora gradle-dependence-graph-generator .

Ogólnie wyjście tej wtyczki można znaleźć w katalogu build / raporty / dependency-graph i zawiera ona trzy pliki (.dot | .png | .svg), jeśli używasz wersji wtyczki 0.5.0 .

Przykład wykresu zależności w prawdziwej aplikacji ( Zegar szachowy ):

wykres

David Miguel
źródło
Hej David, zrobiłem tak, jak powiedziano w instrukcjach wtyczek. Zastosowałem wtyczkę w gradiencie projektu, ale nie widzę żadnego folderu raportów w katalogu kompilacji. Czy jest coś, co musimy zrobić oprócz zbudowania i uruchomienia projektu?
Rushi M Thakker
Ta wtyczka nie pokazuje wersji zależności i konfliktów. jak to dla Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual To sprawia, że ​​jest bezużyteczny ..
sytolk
18

W systemie Android wpisz to w terminalu

gradlew app:dependencies

Spowoduje to wyświetlenie wszystkich zależności oraz tych z nowszymi wersjami, które można uaktualnić jak

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)
Remy
źródło
15

W Gradle wszystko poszło do przodu, więc uważam, że to pytanie zasługuje na inną odpowiedź.
Od wersji 4.3 wprowadzono „ skany kompilacji ”. Wszystkie istotne informacje są dostępne w dokumentach Gradle ( 1 , 2 ). Dla mnie wydaje się to teraz najłatwiejszym sposobem sprawdzenia zależności (i ogólnie kompilacji) w przejrzysty, zorganizowany sposób.

Są bardzo łatwe do utworzenia, wystarczy wykonać:

gradle build --scan  

(lub ./gradlew build --scanjeśli używasz opakowania)

To generuje losowo generowany link, w którym można zobaczyć skan. Otwierając ten link, podajesz swój adres e-mail i zyskujesz pełną kontrolę nad linkiem: np. udostępnij lub usuń. Zawiera wiele informacji o twojej kompilacji , nie tylko zależności. Możesz zobaczyć swoje zależności, ich hierarchie, repozytorium użyte do ich uzyskania, ale także wiele innych rzeczy na temat twojej kompilacji, a mianowicie jej wydajność (która jest interesująca w dużych złożonych kompilacjach), twoje testy, nawet dane wyjściowe konsoli i twoje konfiguracja systemu, w którym zastosowano JDK i JVM, maksymalny rozmiar sterty itp.

To jest ekran z próbnego projektu:

Zbuduj przykład skanowania

Skan kompilacji to udostępniany zapis kompilacji, który zapewnia wgląd w to, co się wydarzyło i dlaczego. Możesz utworzyć skan kompilacji na scans.gradle.com za darmo.

Należy jednak pamiętać, że informacje dotyczące procesu kompilacji zostaną przesłane do serwerów Gradle. Masz pełną kontrolę, aby usunąć go po zakończeniu inspekcji.

Wreszcie, możesz używać skanów kompilacji z wersjami Gradle wcześniejszymi niż 4.3, po prostu musisz ręcznie dodać wtyczkę skanów do swojego buildscript.

Edycja :
Uwzględnienie niektórych komentarzy z komentarzy i dodatkowych notatek:
1) Bardzo trudno jest to zrobić przez pomyłkę lub bez zrozumienia, że ​​niektóre informacje o twojej kompilacji będą dostępne online (prywatne dla ciebie, z możliwością ich usunięcia, ale nadal online) ).

Podczas wykonywania gradle build --scanpojawia się następujący komunikat:

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]

Musisz wyraźnie napisać, yesa następnie wiadomość jest kontynuowana:

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

2) W Gradle Enterprise możesz hostować skany kompilacji na własnych serwerach. Nie mam jednak doświadczenia w tym zakresie i moje proponowane podejście dotyczyło standardowej dystrybucji Gradle, wykorzystując serwery Gradle do skanowania kompilacji.

3) Sam Gradle promuje skany kompilacji jako sposób radzenia sobie z większością problemów z kompilacją.

tryman
źródło
11
Przepraszam, że głosuję za odpowiedzią, ale IMO nie odpowiada na pytanie i nie ostrzega wystarczająco wyraźnie, że gradle build --scanpublikując szczegółowe informacje o swojej kompilacji gdzieś w Internecie - i aby ją usunąć, musisz powiązać ją z działającym adresem e-mail.
Michał
1
Hej, Michale, możesz tak głosować, jeśli tak się czujesz. Jednak muszę zapytać, czy próbowałeś? Podczas wykonywania gradle build --scanw cmd, pojawi się monit: 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]. Musisz pisać ręcznie yes. Zaraz potem pojawi się komunikat: Publishing build scan... https://gradle.com/s/a12en0dasdu(losowo umieść link tego samego typu). Więc wierzę, że to wcześniej odpowiednio cię ostrzega. (1/2)
tryman
1
Możesz odwiedzić link i natychmiast usunąć skan, bez wiadomości e-mail lub czegokolwiek. Jako odpowiedź uważam, że odpowiada na pytanie . W rzeczywistości pokazuje dodatkowe informacje o twoich zależnościach (i pójście o krok dalej: dodatkowe informacje dla całej kompilacji) w porównaniu do innych podejść. Jeśli nie uważasz, że ci się podoba, jest to całkowicie w porządku, ale jest to (według mojej wiedzy) najbardziej wszechstronne narzędzie do pracy, więc warto o tym pamiętać. Wreszcie promuje go sam Gradle, jest to dosłownie ich pierwszy przewodnik (2/2)
tryman
@Michal Przepraszam, zapomniałem Cię otagować, więc być może nie widziałeś moich komentarzy. (Zredagowałem też post, aby uwzględnić komentarze, którymi
udzieliłem
2
Nie próbowałem tego - dziękuję za wyjaśnienie dotyczące akceptacji warunków. Usunąłem moje -1.
Michał
9

W Android Studio

1) Otwórz terminal i upewnij się, że jesteś w folderze głównym projektu.

2) Uruchom ./gradlew app:dependencies (jeśli nie używasz owijarki stopniowej, spróbuj gradle app:dependencies)

Zauważ, że uruchomienie ./gradle dependenciesda ci tylko drzewo zależności folderu głównego projektu, więc wspomnianie o aplikacji w powyższy sposób, tj. ./gradlew app:dependenciesJest ważne.

Shailesh Mamgain
źródło
1
dla mnie działało to bez „./”, w ten sposób: gradlew app: dependencies.
Gilad Levinson
7

Przydatne było również uruchomienie tego:

./gradlew dI --dependency <your library>

To pokazuje, w jaki sposób rozwiązuje się zależności ( dependencyInsight) i pomaga w debugowaniu w miejscu, w którym należy wymusić lub wykluczyć biblioteki w swoimbuild.gradle

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

Christian Vielma
źródło
próbuję tego, jak mówisz, ale to nie działa :( stackoverflow.com/questions/49646103/…
loki
7

Zauważ, że może zajść potrzeba zrobienia czegoś takiego, ./gradlew <module_directory>:<module_name>:dependenciesjeśli moduł ma dodatkowy katalog przed osiągnięciem swojego build.gradle. W razie wątpliwości ./gradlew tasks --allsprawdź nazwę.

Owoc
źródło
7

Dla mnie było to po prostu jedno polecenie

w build.gradle dodaj plugin

apply plugin: 'project-report'

a następnie przejdź do cmd i uruchom następujące polecenie

./gradlew htmlDependencyReport

To daje mi raport HTML Raport WOW Html 💕

To wszystko mój panie.

Dupinder Singh
źródło
Na to już odpowiedział Devstr.
brute_force
Tak, dziękuję @brute_force W tym czasie nie było to dla mnie widoczne. Czego chcesz, usuń moją odpowiedź?
Dupinder Singh
1

W przypadku najnowszych wersji Gradle (testowałem z wersją 6.4.1):

gradle dependencies --configuration compileClasspath

lub jeśli korzystasz z Gradle Wrapper:

gradlew dependencies --configuration compileClasspath
Soufiane Sakhi
źródło
0

Jeśli chcesz wszystkie zależności w jednym pliku na końcu w dwóch krokach. Dodaj to do swojego build.gradle.ktskatalogu głównego projektu:

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

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

}

Następnie zastosuj:

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

To da ci wszystkie zależności w twoim projekcie i podprojektach wraz ze wszystkimi zależnościami stron trzecich.

Jeśli chcesz to zrobić w sposób programowy, będziesz potrzebował niestandardowego mechanizmu renderującego zależności - możesz zacząć od rozszerzenia AsciiDependencyReportRendererdomyślnie drukującego wykres ascii zależności.

codeWhisperer
źródło