Utiliser gradle pour trouver l'arbre de dépendance

543

Est-il possible d'utiliser gradle pour produire un arbre de ce qui dépend de quoi?

J'ai un projet et je voudrais découvrir toutes les dépendances afin que je puisse être en mesure de l'élaguer un peu avec des déclarations avancées, etc.

user3286701
la source
@OliverCharlesworth veuillez utiliser le bouton de fermeture pour marquer la réponse comme doublon
030
1
@ user3286701 peut-être pourriez-vous accepter l'une des réponses?
030
6
gradle dependenciesdevrait marcher. C'est fou comme tout le monde l'a gradlew app:dependenciesprobablement à cause d'Android.
Prayagupd
2
@prayagupd Cela devrait être la réponse. La question concerne Gradle. Après avoir lu les réponses les mieux classées, j'ai ouvert le terminal et je suis entré dans le répertoire d'un projet général qui utilise gradle. J'ai exécuté «gradle app: dependencies» et j'ai obtenu l'erreur «Build failed» même si je n'avais pas prévu de construire quoi que ce soit. Mon projet se construit bien et je voulais juste voir les dépendances.
ka3ak

Réponses:

604

Pour Android, utilisez cette ligne

 gradle app:dependencies

ou si vous avez un emballage Gradle:

./gradlew app:dependencies

appest votre module de projet.

De plus, si vous souhaitez vérifier si quelque chose est compilevs testCompilevs androidTestCompiledépendance ainsi que ce qui le tire:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>
Chad Bingham
la source
10
Ah, je devais y mettre le nom du module. Voilà pourquoi ... Merci!
Jenix
Je viens de commencer à étudier Gradle maintenant, donc un peu confus. Puis-je traiter Gradlew comme Gradle, je veux dire, puis-je saisir les mêmes options / commandes que Gradle avec Gradlew?
Jenix
1
@Jenix ouais, si vous utilisez un wrapper, utilisez simplement ./gradlewà la place degradle
Chad Bingham
2
J'obtiens l'erreur Project 'app' not found in root projectlors de l'exécution de ces commandes. La solution de Benjamins a cependant fonctionné.
krock
5
En fait, ./gradlew :dependenciescela fonctionnera. Il listera les dépendances pour tous vos projets, mais il est facile de trouver le bon.
dirkjot
240

Vous pouvez rendre l'arborescence des dépendances avec la commande gradle dependencies. Pour plus d'informations, consultez la section 11.6.4 Liste des dépendances de projet dans le guide de l'utilisateur en ligne.

Benjamin Muschko
la source
2
Lorsque je fais cela avec mon projet Android, tout ce que j'obtiens est cette sortie: pastebin.com/fHFigAuY Suggestions?
Nilzor
3
@Nilzor Vous exécutez probablement la commande dans le mauvais répertoire (qui ne contient pas le build.gradlefichier) ou votre fichier de build n'applique aucun plugin.
Benjamin Muschko
6
vous pouvez obtenir des dépendances pour un projet spécifique en utilisant gradle: project: dependencies
mbonnin
2
Plugin Android Studio - Gradle View pour analyser les dépendances.
Jignesh Patel
3
Si vous utilisez le wrapper:./gradlew dependencies
ScrappyDev
152

Si vous trouvez difficile de naviguer dans la sortie de la console de gradle dependencies, vous pouvez ajouter le plug - in Rapports de projet :

apply plugin: 'project-report'

Et générez un rapport HTML en utilisant:

$ ./gradlew htmlDependencyReport

Le rapport se trouve normalement dans build/reports/project/dependencies/index.html

Cela ressemble à ceci: entrez la description de l'image ici

Devstr
la source
2
Pour moi, c'était justegradle htmlDependencyReport
Richard Tingle
2
Cela ne fonctionne pas pour les projets multimodules. Je vois juste et vide la liste.
Adam Arold
1
Super trouvaille. Le plugin fait en fait beaucoup plus de docs.gradle.org/current/userguide/project_report_plugin.html
ruX
78

Dans Android Studio (au moins depuis la v2.3.3), vous pouvez exécuter la commande directement à partir de l'interface utilisateur:

Cliquez sur l' onglet Gradle puis double-cliquez sur : yourmodule -> Tasks -> android -> androidDependencies

L'arbre sera affiché dans l' onglet Gradle Console

Une image vaut mille mots

Nicolás Carrasco
la source
1
comment obtenir la vue "Projets Gradle"?
user3526
1
@ user3526 cliquez sur la balise "gradle" située sur le côté droit de votre écran. Regardez l'image ci-jointe pour référence
Nicolás Carrasco
2
J'ai trouvé que cela crée une liste plate dans AS 3.2.0, au lieu d'un arbre. La variante de ligne de commande crée cependant une arborescence.
Tom
5
@Tom exécute la tâche «dépendances» dans la catégorie «aide» et non «android». Il montre comme arbre
Maxim Berezovsky
27

Souvent , le complet test, compileet androidTestCompilegraphe de dépendance est trop pour examiner ensemble. Si vous voulez simplement le compilegraphique de dépendance, vous pouvez utiliser:

./gradlew app:dependencies --configuration compile

Source: Gradle docs section 4.7.6

Remarque: compilea été déconseillé dans les versions plus récentes de Gradle et dans les versions plus récentes, il est conseillé de déplacer toutes vos compiledépendances vers implementation. Veuillez voir cette réponse ici

David Rawson
la source
4
juste une note: la compilation est obsolète, les gens devraient maintenant passer à l'implémentation
reinaldomoreira
25

Si vous souhaitez visualiser vos dépendances dans un graphique, vous pouvez utiliser le plugin gradle-dependency-graph-generator .

Généralement, la sortie de ce plugin se trouve dans le répertoire build / reports / dependency-graph et contient trois fichiers (.dot | .png | .svg) si vous utilisez la version 0.5.0 du plugin.

Exemple de graphique de dépendances dans une application réelle ( Chess Clock ):

graphique

David Miguel
la source
Hey David, j'ai fait ce qui était dit dans les instructions du plugin. J'ai appliqué le plugin dans le projet gradle mais je ne vois aucun dossier de rapports dans le répertoire de construction. Y a-t-il autre chose que nous devons faire à part construire et exécuter le projet?
Rushi M Thakker
Ce plugin n'affiche pas la version des dépendances et les conflits. comme ça pour Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual Cela le rend inutile ..
sytolk
18

Pour Android, saisissez ceci dans le terminal

gradlew app:dependencies

Il listera toutes les dépendances et celles avec des versions plus récentes pour vous mettre à niveau comme

com.android.support:customtabs:26.1.0 -> 27.1.1 (*)
Rémy
la source
15

Les choses ont progressé à Gradle, donc je pense que cette question mérite une autre réponse.
Depuis Gradle 4.3, des « scans de build » ont été introduits. Toutes les informations pertinentes sont disponibles dans les documents Gradle ( 1 , 2 ). Pour moi, cela semble maintenant être le moyen le plus simple de vérifier vos dépendances (et généralement votre build) de manière claire et organisée.

Ils sont très faciles à créer, il suffit d'exécuter:

gradle build --scan  

(ou ./gradlew build --scansi vous utilisez un wrapper)

Cela produit un lien généré aléatoirement où vous pouvez voir votre scan. Lorsque vous ouvrez ce lien, vous entrez votre adresse e-mail et prenez le contrôle total du lien: par exemple. partagez-le ou supprimez-le. Il contient de nombreuses informations sur votre build , pas seulement des dépendances. Vous pouvez voir vos dépendances, leurs hiérarchies, le référentiel utilisé pour les obtenir, mais aussi beaucoup d'autres choses sur votre build, à savoir ses performances (qui sont intéressantes pour les builds complexes), vos tests, même la sortie de votre console et votre configuration du système, qui JDK et JVM ont été utilisés, taille maximale du tas, etc.

Il s'agit d'un écran d'impression d'un projet simulé:

Exemple d'analyse de build

Une analyse de build est un enregistrement partageable d'une build qui fournit des informations sur ce qui s'est passé et pourquoi. Vous pouvez créer gratuitement un scan de build sur scans.gradle.com.

Notez cependant que les informations relatives à votre processus de génération seront envoyées aux serveurs Gradle. Vous avez le plein contrôle pour le supprimer lorsque vous avez terminé votre inspection.

Enfin, vous pouvez également utiliser des scans de build avec des versions Gradle antérieures à 4.3, il vous suffit d'ajouter manuellement le plugin scans dans votre buildscript.

Edit :
Incorporer quelques commentaires des commentaires quelques notes supplémentaires:
1) Il est très difficile de le faire par erreur ou sans comprendre que certaines informations pour votre build seront en ligne (privées pour vous, avec la possibilité de les supprimer, mais toujours en ligne) ).

Lors de l'exécution, gradle build --scanle message suivant apparaît:

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]

Vous devez écrire explicitement yes, puis le message continue:

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

2) Dans Gradle Enterprise, vous pouvez héberger des analyses de génération Gradle sur vos propres serveurs. Cependant, je n'ai aucune expérience dans ce domaine et mon approche proposée concernait la distribution standard de Gradle, en utilisant les serveurs de Gradle pour vos analyses de build.

3) Gradle lui-même fait la promotion des scans de build comme moyen de traiter la plupart de vos problèmes de build.

tryman
la source
11
Désolé de dévaloriser la réponse, mais l'OMI ne répond pas à la question et ne prévient pas assez clairement qu'en gradle build --scanpubliant les détails de votre construction quelque part sur Internet - et pour la supprimer, vous devez l'associer à une adresse e-mail fonctionnelle.
Michal
1
Hé Michal, tu es le bienvenu pour voter si tu le ressens. Cependant, je dois demander, avez-vous essayé? Lors de l' exécution gradle build --scancmd, vous êtes invité: 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]. Vous devez écrire manuellement yes. Juste après cela, vous obtenez le message: Publishing build scan... https://gradle.com/s/a12en0dasdu(mettez au hasard un lien du même type). Je pense donc que cela vous avertit de manière appropriée avant. (1/2)
tryman
1
Vous pouvez visiter le lien et supprimer l'analyse immédiatement, sans e-mail ni rien. En guise de réponse, je crois que cela répond à la question . En fait, il vous montre des informations supplémentaires sur vos dépendances (et va plus loin: des informations supplémentaires pour l'ensemble du build également) par rapport à d'autres approches. Si vous ne le trouvez pas à votre goût, c'est tout à fait correct, mais c'est (à ma connaissance) l'outil le plus complet en ce moment pour le travail, il est donc utile de l'avoir à l'esprit. Enfin, il est promu par Gradle lui-même, c'est littéralement leur premier guide (2/2)
tryman
@Michal Désolé, j'ai oublié de vous taguer avant donc vous n'avez peut-être pas vu mes commentaires. (J'ai également édité le post pour incorporer les commentaires avec lesquels je vous ai répondu.)
tryman
2
Je n'ai pas essayé cela - merci d'avoir clarifié l'acceptation des termes. J'ai supprimé mon -1.
Michal
9

Dans Android Studio

1) Ouvrez le terminal et assurez-vous que vous êtes dans le dossier racine du projet.

2) Exécutez ./gradlew app:dependencies (si vous n'utilisez pas de wrapper Gradle, essayez gradle app:dependencies)

Notez que l'exécution ./gradle dependenciesne vous donnera que l'arbre de dépendance du dossier racine du projet, il est donc important de mentionner l'application de la manière ci-dessus ./gradlew app:dependencies.

Shailesh Mamgain
la source
1
pour moi, cela fonctionnait sans le "./", comme ça: gradlew app: dépendances.
Gilad Levinson
7

J'ai également trouvé utile d'exécuter ceci:

./gradlew dI --dependency <your library>

Cela montre comment les dépendances sont résolues ( dependencyInsight) et vous aide à déboguer où vous devez forcer ou exclure les bibliothèques dans votrebuild.gradle

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

Christian Vielma
la source
j'essaie comme vous le dites mais cela n'a pas fonctionné :( stackoverflow.com/questions/49646103/…
loki
7

Notez que vous devrez peut-être faire quelque chose comme ./gradlew <module_directory>:<module_name>:dependenciessi le module a un répertoire supplémentaire avant d'atteindre son build.gradle. En cas de doute, ./gradlew tasks --allvérifiez le nom.

Fruit
la source
7

Pour moi, c'était simplement une commande

dans build.gradle add plugin

apply plugin: 'project-report'

puis allez à cmd et exécutez la commande suivante

./gradlew htmlDependencyReport

Cela me donne un rapport HTML Rapport WOW Html 💕

C'est tout mon seigneur.

Dupinder Singh
la source
Cela a déjà été répondu par Devstr.
brute_force
Oui, merci @brute_force À ce moment-là, il n'était pas visible pour moi. Que voulez-vous, supprimez ma réponse?
Dupinder Singh
1

Pour les versions récentes de Gradle (j'ai testé avec la version 6.4.1):

gradle dependencies --configuration compileClasspath

ou si vous utilisez le Gradle Wrapper:

gradlew dependencies --configuration compileClasspath
Soufiane Sakhi
la source
0

Si vous voulez toutes les dépendances dans un seul fichier à la fin en deux étapes. Ajoutez ceci à votre build.gradle.ktsdans la racine de votre projet:

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

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

}

Ensuite, appliquez:

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

Cela vous donnera toutes les dépendances de votre projet et sous-projets ainsi que toutes les dépendances tierces.

Si vous voulez que cela se fasse de manière programmatique, vous aurez besoin d'un rendu personnalisé des dépendances - vous pouvez commencer par étendre le AsciiDependencyReportRendererqui imprime un graphique ascii des dépendances par défaut.

codeWhisperer
la source