Использование gradle для поиска дерева зависимостей

543

Можно ли использовать gradle для создания дерева того, что зависит от чего?

У меня есть проект, и я хотел бы выяснить все зависимости, чтобы я мог немного обрезать его с помощью предварительных объявлений и т. Д.

user3286701
источник
4
возможный дубликат команды графа зависимости артефакта графа?
Оливер Чарльзуорт
@OliverCharlesworth, пожалуйста, используйте кнопку закрытия, чтобы пометить ответ как дубликат
030
1
@ user3286701 возможно, вы могли бы принять один из ответов?
0:30
6
gradle dependenciesдолжно сработать. Это безумие, как у всех, gradlew app:dependenciesвероятно, потому что Android.
prayagupd
2
@prayagupd Это должен быть ответ. Вопрос о граде. После прочтения высоко оцененных ответов я открыл терминал и перешел в каталог общего проекта, который использует gradle. Я выполнил 'gradle app: dependencies' и получил ошибку 'Build failed', хотя я не планировал ничего строить. Мой проект работает нормально, и я просто хотел увидеть зависимости.
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
Ах, я должен был поставить имя модуля там. Вот почему ... Спасибо!
Jenix
Только начал учиться на грейдере, поэтому немного растерялся. Могу ли я рассматривать gradlew как gradle, я имею в виду, могу ли я вводить те же опции / команды, что и gradlew с gradlew?
Jenix
1
@ Дженикс, да, если вы используете обертку, просто используйте ./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: dependencies
mbonnin
2
Плагин Android Studio - Gradle View для анализа зависимостей.
Джинеш Патель
3
Если вы используете обертку:./gradlew dependencies
ScrappyDev
152

Если вам трудно ориентироваться в выводе консоли gradle dependencies, вы можете добавить плагин отчетов проекта :

apply plugin: 'project-report'

И сгенерируйте отчет HTML, используя:

$ ./gradlew htmlDependencyReport

Отчет обычно можно найти в build/reports/project/dependencies/index.html

Это выглядит так: введите описание изображения здесь

Devstr
источник
2
Для меня это было простоgradle htmlDependencyReport
Ричард Тингл
2
Это не работает для многомодульных проектов. Я просто вижу и пустой список.
Адам Арольд
1
Отличная находка. На самом деле плагин работает намного больше docs.gradle.org/current/userguide/project_report_plugin.html
ruX,
78

В Android Studio (по крайней мере, начиная с версии 2.3.3) вы можете запустить команду прямо из пользовательского интерфейса:

Нажмите на вкладку Gradle, а затем дважды щелкните : yourmodule -> Tasks -> android -> androidDependencies

Дерево будет отображаться на вкладке Консоль Gradle

Изображение стоит тысячи слов

Николас Карраско
источник
1
Как я могу получить представление "Gradle проектов"?
user3526
1
@ user3526 нажмите на тег "gradle", который находится на правой стороне экрана. Посмотрите на прикрепленное изображение для справки
Николас Карраско
2
Я обнаружил, что это создает плоский список в AS 3.2.0 вместо дерева. Однако вариант командной строки создает дерево.
Том
5
@Tom запустить задачу «зависимости» в категории «справка», а не «Android». Это показывает, как дерево
Максим Березовский
27

Часто полный test, compileи androidTestCompileграф зависимостей слишком сложен для изучения вместе. Если вы просто хотите compileграф зависимостей, вы можете использовать:

./gradlew app:dependencies --configuration compile

Источник: Gradle Docs раздел 4.7.6.

Примечание: compileбыло объявлено устаревшим в более поздних версиях Gradle, и в более поздних версиях рекомендуется перевести все ваши compileзависимости на implementation. Пожалуйста, посмотрите этот ответ здесь

Дэвид Роусон
источник
4
просто примечание: компиляция устарела, теперь люди должны перейти к реализации
reinaldomoreira
25

Если вы хотите визуализировать свои зависимости в графе, вы можете использовать плагин gradle-dependency-graph-generator .

Как правило , выход из этого плагина можно найти в сборках / отчетах / зависимости граф каталога и содержит три файла (.dot | .png | .svg) , если вы используете 0.5.0 версии плагина.

Пример графика зависимостей в реальном приложении ( Chess Clock ):

график

Дэвид Мигель
источник
Привет, Дэвид, я сделал, как было сказано в инструкциях к плагину. Я применил плагин в проекте gradle, но я не вижу никакой папки отчетов в каталоге сборки. Есть ли что-то, что нам нужно сделать, кроме как построить и запустить проект?
Rushi M Thakker
Этот плагин не показывает зависимости версии и конфликтов. как это для Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual Это делает его бесполезным ..
sytolk
18

Для Android введите это в терминале

gradlew app:dependencies

В нем будут перечислены все зависимости и те, с более новыми версиями для вас, чтобы обновить как

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)
Remy
источник
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 продвигает сканирование сборки как способ решения большинства ваших проблем со сборкой.

tryman
источник
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 app: зависимости.
Гилад Левинсон
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 report 💕

Это все, мой господин.

Дюпиндер Сингх
источник
На это уже ответил Devstr.
brute_force
Да, спасибо @brute_force В то время он не был виден мне. Что ты хочешь, убери мой ответ?
Дюпиндер Сингх
1

Для последних версий Gradle (я тестировал с версией 6.4.1):

gradle dependencies --configuration compileClasspath

или если вы используете Gradle Wrapper:

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которое по умолчанию выводит ascii-график зависимостей.

codeWhisperer
источник