Використання gradle для пошуку дерева залежності


542

Чи можна використовувати градел для отримання дерева того, від чого залежить?

У мене є проект, і я хотів би дізнатися всі залежності, щоб я міг трохи спростувати його за допомогою декларацій вперед тощо.



@OliverCharlesworth, будь ласка, використовуйте кнопку закриття, щоб позначити відповідь як дублікат
030

1
@ user3286701 Можливо, ви могли б прийняти одну з відповідей?
030

5
gradle dependenciesповинні працювати. Це божевільно, як всі, gradlew app:dependenciesмабуть, тому, що Android.
праягупд

2
@prayagupd Це повинна бути відповідь. Питання - про граде. Прочитавши високо оцінені відповіді, я відкрив термінал і перейшов до каталогу загального проекту, який використовує gradle. Я виконав додаток 'gradle: залежності' і отримав помилку 'Build fail', хоча нічого не збирався будувати. Мій проект будується чудово, і я просто хотів побачити залежності.
ka3ak

Відповіді:


604

Для Android використовуйте цей рядок

 gradle app:dependencies

або якщо у вас є оболонка з граді:

./gradlew app:dependencies

де appваш модуль проекту.

Крім того, якщо ви хочете перевірити, чи щось compileпроти testCompileі androidTestCompileзалежність, а також те, що це тягне:

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

10
Ах, мені довелося туди поставити назву модуля. Тому ... Дякую!
Дженікс

Тільки-но почав вивчати студла зараз, так трохи розгублений. Чи можу я вважати gradlew як gradle, я можу сказати, чи можу я вводити ті самі параметри / команди, що і gradlew з gradlew?
Дженікс

1
@Jenix Так, якщо ви використовуєте обгортку, просто використовуйте ./gradlewзамістьgradle
Чад Бінгем

2
Я отримую помилку Project 'app' not found in root projectпід час виконання цих команд. Однак рішення Бенджаміна спрацювало.
крок

5
Насправді ./gradlew :dependenciesбуде працювати. У ньому буде перераховано залежності для всіх ваших проектів, але легко знайти правильний.
dirkjot

240

Ви можете надати дерево залежності за допомогою команди gradle dependencies. Для отримання додаткової інформації перегляньте розділ 11.6.4 Перелік залежностей проекту в онлайн-посібнику користувача.


2
Коли я це роблю зі своїм проектом Android, все, що я отримую, - це результат: pastebin.com/fHFigAuY Пропозиції?
Нільзор

3
@Nilzor Ви, ймовірно, виконуєте команду в неправильному каталозі (який не містить build.gradleфайлу) або ваш файл збірки не застосовує жодного плагіна.
Бенджамін Мушко

6
ви можете отримати залежності для конкретного проекту, використовуючи gradle: project: зависимостей
mbonnin

2
Плагін Android Studio - Перегляд Gradle для аналізу залежностей.
Jignesh Patel

3
Якщо ви використовуєте обгортку:./gradlew dependencies
ScrappyDev

152

Якщо вам важко орієнтуватися на вихід консолі gradle dependencies, ви можете додати плагін звітів проекту :

apply plugin: 'project-report'

І створити звіт HTML, використовуючи:

$ ./gradlew htmlDependencyReport

Звіт зазвичай можна знайти в build/reports/project/dependencies/index.html

Це виглядає приблизно так: введіть тут опис зображення


2
Для мене це було простоgradle htmlDependencyReport
Річард Тінгл

2
Це не працює для багатомодульних проектів. Я просто бачу і порожній список.
Адам Арольд

1
Чудова знахідка. Плагін насправді робить більше docs.gradle.org/current/userguide/project_report_plugin.html
ruX

78

В Android Studio (принаймні з v2.3.3) ви можете запустити команду безпосередньо з інтерфейсу користувача:

Перейдіть на вкладку Gradle , а потім двічі клацніть на : yourmodule -> Завдання -> android -> androidDependitions

Дерево відображатиметься на вкладці Консоль Gradle

Образ вартує тисячі слів


1
як я можу отримати уявлення про "градле проекти"?
user3526

1
@ user3526 натисніть на тег "gradle", знайдений у правій частині екрана. Подивіться на додане зображення для довідки
Nicolás Carrasco

2
Я виявив, що це створює плоский список в AS 3.2.0, а не дерево. Однак варіант командного рядка створює дерево.
Том,

5
@ Запустіть завдання "depenties" у категорії "help", а не "android". На ній зображено як дерево
Максим Березовський

27

Часто повні test, compileі androidTestCompileграфи залежностей занадто багато , щоб досліджувати разом. Якщо ви просто хочете compileграфік залежності, ви можете використовувати:

./gradlew app:dependencies --configuration compile

Джерело: Документи Gradle, розділ 4.7.6

Примітка: compileу останніх версіях Gradle застаріло, а в останніх версіях вам рекомендується перенести всі ваші compileзалежності implementation. Будь ласка, дивіться цю відповідь тут


4
лише зауваження: компіляція застаріла, тепер люди повинні перейти до впровадження
reinaldomoreira

25

Якщо ви хочете візуалізувати свої залежності в графіку, ви можете використовувати плагін gradle-залежності-graph-generator .

Як правило, вихід цього плагіна можна знайти в каталозі build / report / зависимості-графік, і він містить три файли (.dot | .png | .svg), якщо ви використовуєте версію 0.5.0 плагіна.

Приклад графіка залежностей у реальній програмі ( Шаховий годинник ):

графік


Гей, Девіде, я зробив, як було сказано в інструкціях до плагіна. Я застосував плагін у gradle проекту, але я не бачу жодної папки звітів у каталозі збірки. Чи є щось, що нам потрібно зробити, крім створення та запуску проекту?
Rushi M Thakker

Цей плагін не показує версію залежності та конфлікти. як це для Мейвена; github.com/janssk1/maven-graph-plugin/wiki/Manual Це робить його марним ..
sytolk

18

Для Android введіть це в терміналі

gradlew app:dependencies

У ньому буде перераховано всі залежності та ті, у кого новіші версії, як ви можете оновити

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

15

У місті Gradle справи просунулися вперед, тому я вважаю, що це питання заслуговує ще однієї відповіді.
З Gradle 4.3 було введено " сканування збірки ". Вся відповідна інформація доступна в документах Gradle ( 1 , 2 ). Для мене, здається, зараз це найпростіший спосіб перевірити свої залежності (і взагалі свою побудову) чітко, організовано.

Їх дуже легко створити, просто виконати:

gradle build --scan  

(або ./gradlew build --scanякщо ви використовуєте обгортку)

Це створює випадковим чином сформоване посилання, де ви можете бачити своє сканування. Відкриваючи це посилання, ви вводите електронну пошту та отримуєте повний контроль над посиланням: наприклад. поділитися ним або видалити. Він отримав багато інформації про вашу збірку , а не лише про залежності. Ви можете побачити ваші залежності, їхні ієрархії, сховище, яке використовується для їх отримання, а також багато іншого про вашу збірку, а саме: її продуктивність (яка цікавить великі складні складання), ваші тести, навіть ваш консольний вихід і ваш конфігурація системи, яку використовували JDK та JVM, максимум розміру купи тощо.

Це друкований екран із макетного проекту:

Приклад сканування побудови

Сканування збірки - це спільний запис збірки, який забезпечує розуміння того, що сталося та чому. Ви можете безкоштовно сканувати збірку на scans.gradle.com.

Зауважте, що інформація про процес збирання буде надсилатися на сервери Gradle. Ви маєте повний контроль, щоб видалити його, коли закінчите перевірку.

Нарешті, ви можете використовувати сканування збірки з версіями Gradle раніше, ніж 4.3, вам просто потрібно вручну додати плагін сканування у вашому buildscript.

Редагувати :
включення відгуків у коментарях, кілька додаткових приміток:
1) Це дуже важко зробити помилково чи не розуміючи, що якась інформація для вашої збірки буде онлайн (приватна для вас, з можливістю видалити її, але все ж онлайн ).

При виконанні gradle build --scanз'являється таке повідомлення:

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]

Ви повинні явно написати, yesа потім повідомлення продовжується:

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

2) У Gradle Enterprise ви можете розмістити сканування збірки gradle на власних серверах. Однак у мене немає досвіду в цьому, і запропонований нами підхід стосувався стандартного розподілу Gradle, використовуючи сервери Gradle для сканування побудови.

3) Gradle сам рекламує сканування збірки як спосіб вирішити більшість проблем зі збиранням.


11
Вибачте, що відповідаю на вимогу, але IMO не відповідає на питання, і це не попереджує досить чітко, що, gradle build --scanпублікуючи деталі своєї конструкції десь в Інтернеті, - і щоб видалити її, вам потрібно пов’язати її з робочою адресою електронної пошти.
Міхал

1
Гей, Міхале, можна запросити на них, якщо ти відчуваєш це так. Однак я маю запитати, ти пробував? При виконанні gradle build --scanв ЦМД, вам буде запропоновано: 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]. Ви повинні писати вручну yes. Відразу після цього ви отримуєте повідомлення: Publishing build scan... https://gradle.com/s/a12en0dasdu(випадковим чином ставити посилання одного типу). Тому я вважаю, що це попереджає вас належним чином раніше. (1/2)
триман

1
Ви можете відвідати посилання та видалити сканування негайно, без електронного листа чи нічого. Як відповідь, я вважаю, що це відповідає на питання . Насправді вона показує додаткову інформацію про ваші залежності (і проходження додаткової милі: додаткова інформація для всієї збірки) також порівняно з іншими підходами. Якщо вам це не подобається, це абсолютно нормально, але це (наскільки мені відомо) найповніший інструмент на даний момент для роботи, тому це важливо мати на увазі. Нарешті, це сприяє сам Gradle, це буквально їх перший путівник (2/2)
tryman

@Michal Вибачте, раніше забув позначити вас, щоб ви не бачили моїх коментарів. (Я також редагував публікацію, щоб включити коментарі, з якими я вам відповів.)
tryman

2
Я цього не пробував - дякую за пояснення щодо прийняття умов. Я зняв -1.
Міхал

9

В Android Studio

1) Відкрийте термінал і переконайтеся, що ви знаходитесь у кореневій папці проекту.

2) Запустити ./gradlew app:dependencies (якщо не використовується оболонка gradle, спробуйте gradle app:dependencies)

Зауважте, що запуск ./gradle dependenciesдасть вам лише дерево залежності кореневої папки проекту, тому згадування програми вище, тобто ./gradlew app:dependenciesважливо.


1
для мене це працювало без "./", як-от: додаток gradlew: залежності.
Гілад Левінсон

7

Також мені було корисно запустити це:

./gradlew dI --dependency <your library>

Це показує, як вирішуються залежності ( dependencyInsight) і допомагає вам налагоджувати, де потрібно примушувати чи виключати бібліотеки у вашихbuild.gradle

Дивіться: https://docs.gradle.org/current/userguide/tutorial_gradle_command_line.html


Я намагаюсь так, як ти кажеш, але це не спрацювало :( stackoverflow.com/questions/49646103/…
loki

7

Зауважте, що вам може знадобитися зробити щось на зразок, ./gradlew <module_directory>:<module_name>:dependenciesякщо модуль має додатковий каталог, перш ніж досягти його build.gradle. Якщо ви сумніваєтесь, зробіть ./gradlew tasks --allперевірку імені.


7

Для мене це була просто одна команда

в build.gradle додати plugin

apply plugin: 'project-report'

а потім перейдіть до cmd і виконайте наступну команду

./gradlew htmlDependencyReport

Це дає мені звіт HTML WOW Html звіт 💕

Це все мій пане.


На це вже відповів Devstr.
brute_force

Так, Дякую @brute_force На той час мене це не було видно. Що ви хочете, видаліть мою відповідь?
Дапіндер Сінгх

1

Для останніх версій Gradle (я тестував версію 6.4.1):

gradle dependencies --configuration compileClasspath

або якщо ви використовуєте обгортку Gradle:

gradlew dependencies --configuration compileClasspath

0

Якщо ви хочете, щоб усі залежності в одному файлі були в кінці протягом двох етапів. Додайте це до build.gradle.ktsкоріння проекту:

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

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

}

Потім застосуйте:

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

Це дасть вам усі залежності у вашому проекті та підпроектах разом із усіма сторонніми залежностями.

Якщо ви хочете виконати це програмно, тоді вам знадобиться спеціальний рендер залежностей - ви можете почати, розширивши, AsciiDependencyReportRendererщо друкує графік ассії залежностей за замовчуванням.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.