Usando gradle para encontrar el árbol de dependencia

543

¿Es posible usar gradle para producir un árbol de lo que depende de qué?

Tengo un proyecto y me gustaría conocer todas las dependencias para poder podarlo un poco con declaraciones directas, etc.

user3286701
fuente
44
posible duplicado de lo que es el comando gradle artifact dependency graph?
Oliver Charlesworth,
@OliverCharlesworth, utilice el botón Cerrar para marcar la respuesta como un duplicado
030
1
@ user3286701 ¿tal vez podría aceptar una de las respuestas?
030
66
gradle dependenciesDeberia trabajar. Es una locura como todos gradlew app:dependenciesprobablemente porque Android.
prayagupd
2
@prayagupd Esta debería ser la respuesta. La pregunta es sobre gradle. Después de leer las respuestas altamente calificadas, abrí el terminal y cd'ed al directorio de un proyecto general que utiliza gradle. Ejecuté 'aplicación gradle: dependencias' y recibí el error 'Error de compilación' aunque no tenía planeado compilar nada. Mi proyecto funciona bien y solo quería ver las dependencias.
ka3ak

Respuestas:

604

Para Android, usa esta línea

 gradle app:dependencies

o si tienes una envoltura de gradle:

./gradlew app:dependencies

¿Dónde appestá tu módulo de proyecto?

Además, si desea verificar si algo es compilevs testCompilevs androidTestCompiledependencia, así como lo que lo atrae:

./gradlew :app:dependencyInsight --configuration compile --dependency <name>
./gradlew :app:dependencyInsight --configuration testCompile --dependency <name>
./gradlew :app:dependencyInsight --configuration androidTestCompile --dependency <name>
Chad Bingham
fuente
10
Ah, tuve que poner el nombre del módulo allí. Por eso ... ¡Gracias!
Jenix
Acabo de empezar a estudiar gradle ahora, un poco confundido. ¿Puedo tratar gradlew como gradle, es decir, puedo ingresar las mismas opciones / comandos que gradlew con gradlew?
Jenix
1
@Jenix sí, si está utilizando un envoltorio, simplemente use ./gradlewen lugar degradle
Chad Bingham el
2
Me sale el error Project 'app' not found in root projectal ejecutar estos comandos. Sin embargo, la solución de Benjamins funcionó.
krock
55
De hecho ./gradlew :dependenciesfuncionará. Enumerará las dependencias para todos sus proyectos, pero es fácil encontrar la correcta.
dirkjot
240

Puede representar el árbol de dependencias con el comando gradle dependencies. Para obtener más información, consulte la sección 11.6.4 Listado de dependencias del proyecto en la guía del usuario en línea.

Benjamin Muschko
fuente
2
Cuando hago esto con mi proyecto de Android, todo lo que obtengo es este resultado: pastebin.com/fHFigAuY ¿Sugerencias?
Nilzor
3
@Nilzor Probablemente esté ejecutando el comando en el directorio incorrecto (que no contiene el build.gradlearchivo) o su archivo de compilación no aplica ningún complemento.
Benjamin Muschko
66
puede obtener dependencias para un proyecto específico usando gradle: project: dependencies
mbonnin
2
Android Studio Plugin - Gradle View para analizar dependencias.
Jignesh Patel
3
Si usa el contenedor:./gradlew dependencies
ScrappyDev
152

Si le resulta difícil navegar por la salida de la consola gradle dependencies, puede agregar el complemento de informes del proyecto :

apply plugin: 'project-report'

Y generar un informe HTML usando:

$ ./gradlew htmlDependencyReport

El informe normalmente se puede encontrar en build/reports/project/dependencies/index.html

Se parece a esto: ingrese la descripción de la imagen aquí

Devstr
fuente
2
Para mí fue sologradle htmlDependencyReport
Richard Tingle
2
Esto no funciona para proyectos multimódulo. Acabo de ver una lista vacía.
Adam Arold
1
Gran hallazgo. El complemento realmente hace mucho más docs.gradle.org/current/userguide/project_report_plugin.html
ruX
78

En Android Studio (al menos desde v2.3.3) puede ejecutar el comando directamente desde la interfaz de usuario:

Haga clic en la pestaña Gradle y luego haga doble clic en : su módulo -> Tareas -> android -> androidDependencies

El árbol se mostrará en la pestaña Gradle Console

Una imagen vale más que mil palabras

Nicolás Carrasco
fuente
1
¿Cómo obtengo la vista "Gradle projects"?
user3526
1
@ user3526 haga clic en la etiqueta "gradle" que se encuentra en el lado derecho de la pantalla. Mire la imagen adjunta como referencia
Nicolás Carrasco
2
Descubrí que esto crea una lista plana en AS 3.2.0, en lugar de un árbol. Sin embargo, la variante de línea de comando crea un árbol.
Tom
55
@Tom ejecuta la tarea 'dependencias' en la categoría 'ayuda' no 'android'. Se muestra como un árbol
Maxim Berezovsky
27

A menudo, el gráfico completo test, compiley de androidTestCompiledependencia es demasiado para examinarlo en conjunto. Si simplemente desea el compilegráfico de dependencia, puede usar:

./gradlew app:dependencies --configuration compile

Fuente: Gradle docs sección 4.7.6

Nota: compileha quedado en desuso en las versiones más recientes de Gradle y en versiones más recientes se recomienda cambiar todas sus compiledependencias implementation. Por favor vea esta respuesta aquí

David Rawson
fuente
44
solo una nota: la compilación ha quedado en desuso, las personas ahora deberían pasar a la implementación
reinaldomoreira
25

Si desea visualizar sus dependencias en un gráfico, puede usar el complemento gradle-dependency-graph-generator .

En general, la salida de este complemento se puede encontrar en el directorio build / reports / dependency-graph y contiene tres archivos (.dot | .png | .svg) si está utilizando la versión 0.5.0 del complemento.

Ejemplo de gráfico de dependencias en una aplicación real ( Chess Clock ):

grafico

David Miguel
fuente
Hola David, hice lo que me dijeron en las instrucciones del complemento. Apliqué el complemento en el proyecto gradle pero no veo ninguna carpeta de informes en el directorio de compilación. ¿Hay algo que debamos hacer además de compilar y ejecutar el proyecto?
Rushi M Thakker
Este complemento no muestra la versión de dependencia y los conflictos. así para Maven; github.com/janssk1/maven-graph-plugin/wiki/Manual Esto hace que sea inútil ..
sytolk
18

Para Android, escriba esto en la terminal

gradlew app:dependencies

Enumerará todas las dependencias y las que tengan versiones más nuevas para que pueda actualizar como

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

Las cosas han avanzado en Gradle, así que creo que esta pregunta merece otra respuesta.
Desde Gradle 4.3, se introdujeron los " análisis de compilación ". Toda la información relevante está disponible en los documentos de Gradle ( 1 , 2 ). Para mí, esta parece ser la forma más fácil de verificar sus dependencias (y generalmente su compilación) de una manera clara y organizada.

Son muy fáciles de crear, solo ejecute:

gradle build --scan  

(o ./gradlew build --scansi usa una envoltura)

Esto produce un enlace generado aleatoriamente donde puede ver su escaneo. Al abrir ese enlace, ingresa su correo electrónico y obtiene el control total del enlace: por ejemplo. compártelo o bórralo. Tiene mucha información sobre su compilación , no solo dependencias. Puede ver sus dependencias, sus jerarquías, el repositorio utilizado para obtenerlas, pero también muchas otras cosas sobre su compilación, a saber, su rendimiento (que es de interés en compilaciones grandes y complejas), sus pruebas, incluso la salida de su consola y su configuración del sistema, qué JDK y JVM se utilizaron, tamaño máximo de almacenamiento dinámico, etc.

Esta es una pantalla de impresión de un proyecto simulado:

Construir ejemplo de escaneo

Una exploración de compilación es un registro compartible de una compilación que proporciona información sobre lo que sucedió y por qué. Puede crear una exploración de compilación en scans.gradle.com de forma gratuita.

Sin embargo, tenga en cuenta que esa información para su proceso de compilación se enviará a los servidores de Gradle. Tiene control total para eliminarlo cuando haya terminado con su inspección.

Finalmente, también puede usar escaneos de compilación con versiones de Gradle anteriores a 4.3, solo tiene que agregar manualmente el complemento de escaneos en su buildscript.

Editar :
incorporando algunos comentarios de los comentarios, algunas notas adicionales:
1) Es muy difícil hacerlo por error o sin comprender que cierta información para su compilación estará en línea (privada para usted, con la capacidad de eliminarla, pero aún en línea )

Al ejecutar gradle build --scanaparece el siguiente mensaje:

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]

Tienes que escribir explícitamente yesy luego el mensaje continúa:

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

2) En Gradle Enterprise puede alojar análisis de compilación de gradle en sus propios servidores. Sin embargo, no tengo experiencia en esto y mi enfoque propuesto era sobre la distribución estándar de Gradle, utilizando los servidores de Gradle para sus análisis de compilación.

3) Gradle promueve los análisis de compilación como la forma de lidiar con la mayoría de sus problemas de compilación.

tryman
fuente
11
Lamento rechazar la respuesta, pero en mi opinión no responde la pregunta y no advierte con suficiente claridad que al gradle build --scanpublicar detalles de su compilación en algún lugar de Internet, y para eliminarla debe asociarla con una dirección de correo electrónico que funcione.
Michal
1
Hola Michal, puedes hacer un voto negativo si te sientes así. Sin embargo, tengo que preguntar, ¿lo intentaste? Al ejecutar gradle build --scancmd, se le pregunta: 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]. Tienes que escribir manualmente yes. Justo después de eso, obtienes el mensaje: Publishing build scan... https://gradle.com/s/a12en0dasdu(pon al azar un enlace del mismo tipo). Así que creo que te advierte apropiadamente antes. (1/2)
tryman
1
Puede visitar el enlace y eliminar el escaneo de inmediato, sin un correo electrónico ni nada. Como respuesta, creo que responde la pregunta . De hecho, le muestra información adicional sobre sus dependencias (y va más allá: información adicional para toda la compilación también) en comparación con otros enfoques. Si no lo encuentra a su gusto, está totalmente bien, pero es (que yo sepa) la herramienta más completa en este momento para el trabajo, por lo que es valioso tenerlo en cuenta. Finalmente, es promovida por Gradle, es literalmente su primera guía (2/2)
tryman
@Michal Lo siento, olvidé etiquetarte antes, así que es posible que no hayas visto mis comentarios. (También edité la publicación para incorporar los comentarios con los que te respondí.)
tryman
2
No lo he intentado, gracias por aclarar sobre la aceptación de los términos. Quité mi -1.
Michal
9

En Android Studio

1) Abra la terminal y asegúrese de estar en la carpeta raíz del proyecto.

2) Ejecutar ./gradlew app:dependencies (si no usa gradle wrapper, intente gradle app:dependencies)

Tenga en cuenta que la ejecución ./gradle dependenciessolo le dará un árbol de dependencia de la carpeta raíz del proyecto, por lo que ./gradlew app:dependencieses importante mencionar la aplicación de la manera anterior .

Shailesh Mamgain
fuente
1
para mí funcionó sin "./", así: aplicación gradlew: dependencias
Gilad Levinson
7

Tenga en cuenta que es posible que deba hacer algo como ./gradlew <module_directory>:<module_name>:dependenciessi el módulo tiene un directorio adicional antes de llegar a su build.gradle. En caso de duda, ./gradlew tasks --allverifique el nombre.

Fruta
fuente
7

Para mí, fue simplemente un comando

en build.gradle add plugin

apply plugin: 'project-report'

y luego ve a cmd y ejecuta el siguiente comando

./gradlew htmlDependencyReport

Esto me da un informe HTML WOW Html report 💕

Eso es todo mi señor.

Dupinder Singh
fuente
Esto ya ha sido respondido por Devstr.
brute_force
Sí, gracias @brute_force En ese momento no era visible para mí. ¿Qué quieres? ¿Eliminar mi respuesta?
Dupinder Singh
1

Para versiones recientes de Gradle (probé con la versión 6.4.1):

gradle dependencies --configuration compileClasspath

o si estás usando Gradle Wrapper:

gradlew dependencies --configuration compileClasspath
Soufiane Sakhi
fuente
0

Si desea todas las dependencias en un solo archivo al final dentro de dos pasos. Agregue esto a su build.gradle.ktsen la raíz de su proyecto:

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

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

}

Luego aplique:

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

Esto le dará todas las dependencias en su proyecto y subproyectos junto con todas las dependencias de terceros.

Si desea hacer esto de forma programática, necesitará un renderizador personalizado de las dependencias; puede comenzar extendiendo el AsciiDependencyReportRendererque imprime un gráfico ascii de las dependencias de forma predeterminada.

codeWhisperer
fuente