¿Hay alguna manera de enumerar las dependencias de tareas en Gradle?

139

./gradle tasksenumera "algunas" de las tareas. Mirando http://gradle.org/docs/current/userguide/java_plugin.html hay algunos ocultos que no están en la lista. Además, otros complementos no tendrán un gráfico tan bonito de las dependencias entre tareas.

¿Hay alguna manera de

  1. enumerar todas las tareas en todos los complementos con gradle
  2. enumerar las tareas y de qué tareas dependen (algo así como las de Maven dependency:treepero para tareas)
Dean Hiller
fuente

Respuestas:

99

puede usar el indicador --all para obtener una lista más detallada de las tareas disponibles y las dependencias de las tareas

gradle tasks --all

EDITAR: como señaló Radim en los comentarios, este comando no informa dependencias, para gradle 3.3 y versiones posteriores (consulte https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- informe ).

Rene Groeschke
fuente
¿no parece enumerar una tarea para descargar dependencias de la web en cualquier lugar? Ejecutar el eclipse de tareas claramente descarga cosas pero no está seguro de dónde está esa dependencia ... ¿no hay forma de sobrecargarla?
Dean Hiller
2
La acción de descargar recursos no está vinculada a una tarea dedicada. Las dependencias en gradle se agregan a las configuraciones. Tan pronto como usted (en su propia implementación de tareas) o gradle (en sus propias tareas proporcionadas) hace referencia a los archivos de esta configuración, se activa el mecanismo de resolución.
Rene Groeschke
54
Esto no enumera las dependencias, al menos con Gradle 1.5 o 1.7. ¿Es que alguna vez hizo eso o es una respuesta incompleta?
Tom Anderson
10
Funciona solo para gradle anteriores a 3.3. Hubo un cambio en el informe de tareas que eliminó este resultado.
Radim
135

enumerar las tareas y de qué tareas dependen (algo así como la dependencia de Maven: árbol pero para tareas)

para esto puede usar la opción --dry-run(o -m) que enumera las tareas que se ejecutan para un comando en particular, pero no ejecuta el comando, p. ej.

gradle assemble --dry-run

puedes encontrar más aquí

Marko Vranjkovic
fuente
2
Esto no enumera un árbol de tareas o dependencias de tareas, solo enumera qué tareas se habrían ejecutado.
bcampolo
@bcampolo ¿Cuál es la diferencia?
Kiltek
39

Puede probar el complemento com.dorongold.task-tree con un uso simple:

gradle <task 1>...<task N> taskTree

Ejemplo de resultado del archivo Léame :

gradle build taskTree

:build
+--- :assemble
|    \--- :jar
|         \--- :classes
|              +--- :compileJava
|              \--- :processResources
\--- :check
     \--- :test
          +--- :classes
          |    +--- :compileJava
          |    \--- :processResources
          \--- :testClasses
               +--- :compileTestJava
               |    \--- :classes
               |         +--- :compileJava
               |         \--- :processResources
               \--- :processTestResources
Oleksandr
fuente
55
Para una salida más limpia, use --no-repeat. Fuente: github.com/dorongold/gradle-task-tree
AlikElzin-kilaka
31

Puedes pegar esto en tu build.gradle:

gradle.taskGraph.whenReady {taskGraph ->
    println "Found task graph: " + taskGraph
    println "Found " + taskGraph.allTasks.size() + " tasks."
    taskGraph.allTasks.forEach { task ->
        println task
        task.dependsOn.forEach { dep ->
            println "  - " + dep
        }
    }
}

o esto en tu build.gradle.kts:

gradle.taskGraph.whenReady(closureOf<TaskExecutionGraph> {
    println("Found task graph: $this")
    println("Found " + allTasks.size + " tasks.")
    allTasks.forEach { task ->
        println(task)
        task.dependsOn.forEach { dep ->
            println("  - $dep")
        }
    }
})

Luego ejecuta tu tarea con gradle:

./gradlew build

Y deberías ver esto:

Found task graph: org.gradle.execution.taskgraph.DefaultTaskGraphExecuter@36eb780c
Found 19 tasks.
task ':compileJava'
  - task 'compileJava' input files
task ':compileScala'
  - task 'compileScala' input files
  - compileJava
task ':processResources'
  - task 'processResources' input files
task ':classes'
  - org.gradle.api.internal.tasks.DefaultTaskDependency@287a7782
  - task 'classes' input files
  - compileJava
  - dirs
  - compileScala
  - processResources
task ':jar'
  - task 'jar' input files
task ':assemble'
  - task 'assemble' input files
  - org.gradle.api.internal.artifacts.DefaultPublishArtifactSet$ArtifactsTaskDependency@5bad9616
task ':compileTestJava'
    - task 'compileTestJava' input files
task ':compileTestScala'
  - task 'compileTestScala' input files
  - compileTestJava
task ':processTestResources'
  - task 'processTestResources' input files
task ':testClasses'
  - processTestResources
  - task 'testClasses' input files
  - compileTestScala
  - org.gradle.api.internal.tasks.DefaultTaskDependency@42c1fa08
  - compileTestJava
  - dirs
task ':compileIntegrationTestJava'
  - task 'compileIntegrationTestJava' input files
task ':compileIntegrationTestScala'
  - task 'compileIntegrationTestScala' input files
  - compileIntegrationTestJava
task ':processIntegrationTestResources'
  - task 'processIntegrationTestResources' input files
task ':integrationTestClasses'
  - processIntegrationTestResources
  - compileIntegrationTestJava
  - org.gradle.api.internal.tasks.DefaultTaskDependency@7c8aa0fe
  - compileIntegrationTestScala
  - dirs
  - task 'integrationTestClasses' input files
task ':composeUp'
  - task 'composeUp' input files
task ':integrationTest'
  - task ':composeUp'
  - task 'integrationTest' input files
task ':test'
  - task 'test' input files
task ':check'
  - task 'check' input files
  - task ':test'
  - task ':integrationTest'
task ':build'
  - task 'build' input files
  - check
  - assemble
cstroe
fuente
Esto se parece un poco a un gráfico, pero en realidad es de lo que depende cada tarea. Es una lista de nodos con los padres de cada nodo. Entonces, si su gráfico se ve así A <- B <- (C and D), esto le mostrará B-A, C-B, D-B. ¡Todavía ayuda a algunos!
Noumenon
1
Debería ser un gráfico, pero renderizar un gráfico no es trivial. El resultado del código anterior solo enumera las dependencias inmediatas de una tarea.
cstroe
15

El árbol de tareas de Gradle puede visualizarse gradle tasks --all o probar los siguientes complementos:

Gráficos Gradle y Talaiot: Investigue esto: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 blog, ya que enumera las tareas y dependencias de visualización gráfica. Utiliza la herramienta gratuita abierta Graphviz Gephi ( https://gephi.org/features/ )

gradle-task-tree : https://github.com/dorongold/gradle-task-tree y

gradle-visteg : https://github.com/mmalohlava/gradle-visteg

  1. Complemento gradle-visteg : el archivo generado se puede procesar posteriormente a través de la utilidad Graphviz dot .

  2. Por ejemplo , la imagen png se produce de la siguiente manera:

    cd build/reports/; dot -Tpng ./visteg.dot -o ./visteg.dot.png

Para obtener más información, visite la página de inicio de Graphviz .

Cualquier tarea que se use realmente para ejecutar una tarea (por ejemplo:) buildse puede ver en una buena página HTML usando la --profileopción

gradle --perfil de construcción limpia

Una vez que esto se haya completado, vaya a la carpeta build / reports / profile y explore el archivo .html. Verá la resolución de dependencias y otra información con el tiempo que tomó en una buena página html.

AKS
fuente
11
El informe no contiene ninguna información sobre las dependencias entre tareas. Simplemente enumera secuencialmente todas las tareas que se ejecutaron durante la compilación.
rwitzel
7

Puede acceder mediante programación al gráfico de tareas para inspeccionarlo dentro del script de compilación utilizando Gradle.getTaskGraph ()

Dylan Bijnagte
fuente
66
gradle.getTaskGraph () solo le muestra las tareas que se ejecutarán en su compilación actual de gradle Y este taskGraph solo está disponible en la fase de ejecución.
Rene Groeschke
3

A medida que crece su multiproyecto, la solución que marqué como correcta crece un poco extraño y difícil de leer

gradle tasks --all

En cambio, pasé a mirar un proyecto específico que lo hace mucho más fácil

gradlew :full-httpproxy:tasks --all

donde 'full-httpproxy' es el nombre de mi proyecto (y directorio como es típico).

Sin embargo, tengo curiosidad por cómo enumerar tareas en el proyecto maestro / raíz y tengo una pregunta pendiente aquí también

¿Cómo enumerar todas las tareas para el proyecto maestro solo en gradle?

ya que hacer eso no parece posible en este momento.

Dean Hiller
fuente
0

Después de la respuesta de cstroe, lo siguiente también imprime los archivos de entrada y salida de cada tarea de Gradle. Esto es útil ya que las dependencias a veces se definen por las relaciones de entrada / salida. Es decir, si la tarea B usa los resultados de la tarea A, la respuesta de cstroe no le mostrará la dependencia. Lo siguiente es muy primitivo pero muestra la lista de archivos de entrada y salida para cada tarea:

gradle.taskGraph.whenReady {taskGraph ->
    println "Found task graph: " + taskGraph
    println "Found " + taskGraph.allTasks.size() + " tasks."
    taskGraph.allTasks.forEach { task ->
        println()
        println("----- " + task + " -----")
        println("depends on tasks: " + task.dependsOn)
        println("inputs: ")
        task.inputs.getFiles().getFiles().collect { f -> println(" - " + f)}
        println("outputs: ")
        task.outputs.getFiles().getFiles().collect { f -> println(" + " + f)}
    }
}
nimrodm
fuente