Menggunakan gradle untuk menemukan pohon dependensi

543

Apakah mungkin menggunakan gradle untuk menghasilkan pohon yang tergantung pada apa?

Saya punya proyek dan ingin mengetahui semua dependensi sehingga saya mungkin dapat memangkasnya sedikit dengan deklarasi maju dll.

pengguna3286701
sumber
4
mungkin duplikat dari apa perintah grafik dependensi artefak gradle?
Oliver Charlesworth
@OliverCharlesworth silakan gunakan tombol tutup untuk menandai jawaban sebagai duplikat
030
1
@ user3286701 mungkin Anda bisa menerima salah satu jawabannya?
030
6
gradle dependenciesharus bekerja. Ini gila bagaimana semua orang gradlew app:dependenciesmungkin karena Android.
prayagupd
2
@prayagupd Ini seharusnya jawabannya. Pertanyaannya adalah tentang gradle. Setelah membaca jawaban yang berperingkat sangat tinggi, saya membuka terminal dan menuju direktori proyek umum yang menggunakan gradle. Saya mengeksekusi 'gradle app: dependencies' dan mendapatkan kesalahan 'Build gagal' meskipun saya tidak berencana membangun apa pun. Proyek saya dibangun dengan baik dan saya hanya ingin melihat dependensi.
ka3ak

Jawaban:

604

Untuk Android, gunakan baris ini

 gradle app:dependencies

atau jika Anda memiliki pembungkus gradle:

./gradlew app:dependencies

di mana appmodul proyek Anda.

Selain itu, jika Anda ingin memeriksa apakah sesuatu compilevs testCompilevs androidTestCompileketergantungan serta apa yang menariknya:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>
Chad Bingham
sumber
10
Ah, saya harus meletakkan nama modul di sana. Itu sebabnya ... Terima kasih!
Jenix
Baru mulai belajar gradle sekarang, jadi sedikit bingung. Dapatkah saya memperlakukan gradlew sebagai gradle, maksud saya, dapatkah saya memasukkan opsi / perintah yang sama seperti gradle dengan gradlew?
Jenix
1
@ Jenix ya, jika Anda menggunakan pembungkus hanya gunakan ./gradlewdi tempatgradle
Chad Bingham
2
Saya mendapatkan kesalahan Project 'app' not found in root projectsaat menjalankan perintah ini. Namun solusi Benjamins berhasil.
Krock
5
Bahkan ./gradlew :dependenciesakan berhasil. Ini akan mencantumkan dependensi untuk semua proyek Anda, tetapi mudah untuk menemukan yang tepat.
dirkjot
240

Anda bisa membuat pohon ketergantungan dengan perintah gradle dependencies. Untuk informasi lebih lanjut, baca bagian 11.6.4 Mendaftarkan dependensi proyek dalam panduan pengguna online.

Benjamin Muschko
sumber
2
Ketika saya melakukan ini dengan proyek Android saya, yang saya dapatkan adalah output ini: pastebin.com/fHFigAuY Saran?
Nilzor
3
@Nilzor Anda mungkin menjalankan perintah di direktori yang salah (yang tidak berisi build.gradlefile) atau file build Anda tidak menggunakan plugin apa pun.
Benjamin Muschko
6
Anda bisa mendapatkan dependensi untuk proyek tertentu menggunakan gradle: project: dependencies
mbonnin
2
Android Studio Plugin - Gradle View untuk menganalisis dependensi.
Jignesh Patel
3
Jika Anda menggunakan pembungkus:./gradlew dependencies
ScrappyDev
152

Jika Anda merasa sulit untuk menavigasi keluaran konsol gradle dependencies, Anda dapat menambahkan plugin Laporan proyek :

apply plugin: 'project-report'

Dan hasilkan laporan HTML menggunakan:

$ ./gradlew htmlDependencyReport

Laporan biasanya dapat ditemukan di build/reports/project/dependencies/index.html

Ini terlihat seperti ini: masukkan deskripsi gambar di sini

Devstr
sumber
2
Bagi saya itu hanyagradle htmlDependencyReport
Richard Tingle
2
Ini tidak berfungsi untuk proyek multimodule. Saya hanya melihat dan mengosongkan daftar.
Adam Arold
1
Great ditemukan. Plugin sebenarnya melakukan lebih banyak docs.gradle.org/current/userguide/project_report_plugin.html
ruX
78

Di Android Studio (setidaknya sejak v2.3.3) Anda dapat menjalankan perintah langsung dari UI:

Klik pada tab Gradle lalu klik dua kali pada : yourmodule -> Tasks -> android -> androidDependencies

Pohon akan ditampilkan di tab Gradle Console

Sebuah gambar bernilai ribuan kata

Nicolás Carrasco
sumber
1
bagaimana cara mendapatkan tampilan "proyek bertahap"?
user3526
1
@ user3526 klik pada tag "gradle" yang ditemukan di sisi kanan layar Anda. Lihatlah gambar terlampir untuk referensi
Nicolás Carrasco
2
Saya menemukan bahwa ini membuat daftar datar di AS 3.2.0, bukan pohon. Namun varian baris perintah membuat pohon.
Tom
5
@ Tom menjalankan tugas 'depency' di bawah kategori 'help' bukan 'android'. Ini ditampilkan sebagai pohon
Maxim Berezovsky
27

Seringkali grafik lengkap test,, compiledan androidTestCompiledependensi terlalu banyak untuk diperiksa bersama. Jika Anda hanya menginginkan compilegrafik dependensi, Anda dapat menggunakan:

./gradlew app:dependencies --configuration compile

Sumber: Dokumen Gradle bagian 4.7.6

Catatan: compiletelah ditinggalkan dalam versi Gradle yang lebih baru dan di versi yang lebih baru Anda disarankan untuk mengalihkan semua compiledependensi Anda ke implementation. Silakan lihat jawaban ini di sini

David Rawson
sumber
4
hanya sebuah catatan: kompilasi telah ditinggalkan, orang sekarang harus pindah ke implementasi
reinaldomoreira
25

Jika Anda ingin memvisualisasikan dependensi Anda dalam grafik, Anda dapat menggunakan plugin gradle-dependency-graph-generator .

Secara umum output dari plugin ini dapat ditemukan di direktori build / reports / dependency-graph dan berisi tiga file (.dot | .png | .svg) jika Anda menggunakan versi plugin 0.5.0 .

Contoh grafik ketergantungan dalam aplikasi nyata ( Catur Jam ):

grafik

David Miguel
sumber
Hei David, saya melakukan seperti yang diperintahkan dalam instruksi plugin. Saya menerapkan plugin dalam proyek gradle tetapi saya tidak melihat folder laporan di direktori build. Adakah yang perlu kita lakukan selain membangun dan menjalankan proyek?
Rushi M Thakker
Plugin ini tidak menunjukkan versi ketergantungan dan konflik. seperti ini untuk Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual Ini membuatnya tidak berguna ..
sytolk
18

Untuk Android, ketik terminal ini

gradlew app:dependencies

Ini akan mencantumkan semua dependensi dan yang dengan versi yang lebih baru untuk Anda tingkatkan seperti

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

Banyak hal telah bergerak maju di Gradle jadi saya percaya pertanyaan ini pantas mendapat jawaban lain.
Sejak Gradle 4.3, " build scan " diperkenalkan. Semua info yang relevan tersedia di dokumen Gradle ( 1 , 2 ). Bagi saya, ini sekarang tampaknya menjadi cara termudah untuk memeriksa dependensi Anda (dan umumnya build Anda) dengan cara yang jelas dan terorganisir.

Mereka sangat mudah dibuat, jalankan saja:

gradle build --scan  

(atau ./gradlew build --scanjika Anda menggunakan pembungkus)

Ini menghasilkan tautan yang dibuat secara acak di mana Anda dapat melihat pemindaian Anda. Saat membuka tautan itu, Anda memasukkan email Anda dan mendapatkan kendali penuh atas tautan tersebut: mis. bagikan atau hapus itu. Telah mendapat banyak info tentang bangunan Anda , bukan hanya dependensi. Anda dapat melihat dependensi Anda, hierarki mereka, repositori yang digunakan untuk mendapatkannya tetapi juga banyak hal lain tentang build Anda, yaitu kinerjanya (yang menarik pada build kompleks besar), pengujian Anda, bahkan output konsol Anda dan Anda konfigurasi sistem, yang digunakan JDK dan JVM, ukuran tumpukan maksimum dll.

Ini adalah printscreen dari proyek tiruan:

Bangun contoh pemindaian

Pemindaian build adalah catatan build yang dapat dibagikan yang memberikan wawasan tentang apa yang terjadi dan mengapa. Anda dapat membuat pemindaian build di scans.gradle.com gratis.

Namun, perlu diketahui bahwa info untuk proses pembuatan Anda akan dikirim ke server Gradle. Anda memiliki kontrol penuh untuk menghapusnya ketika Anda selesai dengan inspeksi Anda.

Akhirnya, Anda dapat menggunakan build scan dengan versi Gradle lebih awal dari 4.3 juga, Anda hanya perlu menambahkan plugin scan secara manual di buildscript Anda.

Sunting :
Memasukkan beberapa umpan balik dari komentar beberapa catatan tambahan:
1) Sangat sulit untuk melakukan ini secara tidak sengaja atau tanpa memahami bahwa beberapa info untuk bangunan Anda akan online (pribadi untuk Anda, dengan kemampuan untuk menghapusnya, tetapi masih online) ).

Saat menjalankan gradle build --scanpesan berikut muncul:

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]

Anda harus menulis secara eksplisit yesdan kemudian pesan itu berlanjut:

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

2) Di Gradle Enterprise Anda dapat meng-host pemindaian gradle di server Anda sendiri. Namun saya tidak memiliki pengalaman dalam hal ini dan pendekatan yang saya usulkan adalah tentang distribusi Gradle standar, menggunakan server Gradle untuk pemindaian build Anda.

3) Gradle sendiri mempromosikan pemindaian build sebagai cara untuk mengatasi sebagian besar masalah build Anda.

penjahat
sumber
11
Maaf untuk membatalkan jawaban, tetapi IMO itu tidak menjawab pertanyaan dan itu tidak cukup jelas memperingatkan bahwa dengan gradle build --scanAnda mempublikasikan detail bangunan Anda di suatu tempat di internet - dan untuk menghapusnya Anda harus mengaitkannya dengan alamat email yang berfungsi.
Michal
1
Hei Michal, Anda dipersilakan untuk downvote jika Anda merasa seperti itu. Namun saya harus bertanya, apakah Anda mencobanya? Ketika menjalankan gradle build --scancmd, Anda diminta: 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]. Anda harus menulis secara manual yes. Tepat setelah itu, Anda mendapatkan pesan: Publishing build scan... https://gradle.com/s/a12en0dasdu(secara acak masukkan tautan dari jenis yang sama). Jadi saya yakin itu memperingatkan Anda dengan tepat sebelumnya. (1/2)
penjahat
1
Anda dapat mengunjungi tautan dan menghapus pemindaian segera, tanpa email atau apa pun. Sebagai jawaban, saya yakin itu menjawab pertanyaan . Bahkan, itu menunjukkan Anda info tambahan tentang dependensi Anda (dan bekerja ekstra: info tambahan untuk seluruh build juga) dibandingkan dengan pendekatan lain. Jika Anda tidak menyukainya sesuai dengan keinginan Anda, tetapi itu (setahu saya) alat yang paling komprehensif saat ini untuk pekerjaan itu, jadi sangat berharga untuk mengingatnya. Akhirnya, dipromosikan oleh Gradle sendiri, ini secara harfiah adalah panduan pertama mereka (2/2)
tryman
@Michal Maaf, lupa memberi tag Anda sebelumnya sehingga Anda mungkin belum melihat komentar saya. (Saya juga mengedit posting untuk memasukkan komentar yang saya jawab kepada Anda.)
tryman
2
Saya belum mencobanya - terima kasih telah menjelaskan tentang penerimaan persyaratan. Saya menghapus -1 saya.
Michal
9

Di Android Studio

1) Buka terminal dan pastikan Anda berada di folder root proyek.

2) Jalankan ./gradlew app:dependencies (jika tidak menggunakan pembungkus gradle, coba gradle app:dependencies)

Perhatikan bahwa menjalankan ./gradle dependencieshanya akan memberi Anda pohon dependensi dari folder root proyek, jadi menyebutkan aplikasi dengan cara di atas, yaitu ./gradlew app:dependenciespenting.

Shailesh Mamgain
sumber
1
bagi saya itu bekerja tanpa "./", seperti itu: aplikasi gradlew: dependensi.
Gilad Levinson
7

Saya juga menemukan manfaat untuk menjalankan ini:

./gradlew dI --dependency <your library>

Ini menunjukkan bagaimana ketergantungan sedang diselesaikan ( dependencyInsight) dan membantu Anda men-debug ke mana Anda perlu memaksa atau mengecualikan perpustakaan di Andabuild.gradle

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

Christian Vielma
sumber
Saya mencoba ini seperti yang Anda katakan tetapi tidak berhasil :( stackoverflow.com/questions/49646103/…
loki
7

Perhatikan bahwa Anda mungkin perlu melakukan sesuatu seperti ./gradlew <module_directory>:<module_name>:dependenciesjika modul memiliki direktori tambahan sebelum mencapai build.gradle-nya. Jika ragu, lakukan ./gradlew tasks --alluntuk memeriksa nama.

Buah
sumber
7

Bagi saya, itu hanya satu perintah

di build.gradle tambahkan plugin

apply plugin: 'project-report'

dan kemudian pergi ke cmd dan jalankan perintah berikut

./gradlew htmlDependencyReport

Ini memberi saya laporan HTML WOW Html report 💕

Itu semua tuanku.

Dupinder Singh
sumber
Ini sudah dijawab oleh Devstr.
brute_force
Ya, Terima kasih @ brute_force Saat itu tidak terlihat oleh saya. Apa yang Anda inginkan, hapus jawaban saya?
Dupinder Singh
1

Untuk versi terbaru Gradle (Saya menguji dengan versi 6.4.1):

gradle dependencies --configuration compileClasspath

atau jika Anda menggunakan Gradle Wrapper:

gradlew dependencies --configuration compileClasspath
Soufiane Sakhi
sumber
0

Jika Anda ingin semua dependensi dalam satu file di akhir dalam dua langkah. Tambahkan ini ke Anda build.gradle.ktsdi root proyek Anda:

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

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

}

Kemudian terapkan:

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

Ini akan memberi Anda semua dependensi dalam proyek dan sub-proyek Anda bersama dengan semua dependensi pihak ke-3.

Jika Anda ingin menyelesaikan ini dengan cara terprogram, maka Anda akan memerlukan penyaji kustom dari dependensi - Anda dapat mulai dengan memperluas AsciiDependencyReportRendereryang mencetak grafik ascii dari dependensi secara default.

codeWhisperer
sumber