C'è un modo per elencare le dipendenze delle attività in Gradle?


139

./gradle taskselenca "alcuni" dei compiti. Guardando http://gradle.org/docs/current/userguide/java_plugin.html ci sono quelli nascosti non elencati. Inoltre, altri plug-in non avranno un bel grafico delle dipendenze tra le attività.

C'è un modo per

  1. elenca tutte le attività in tutti i plugin con gradle
  2. elenca le attività e da quali attività dipendono (un po 'come quelle di maven dependency:treema per le attività)

Risposte:


99

è possibile utilizzare il flag --all per ottenere un elenco più dettagliato delle attività disponibili e delle dipendenze delle attività

gradle tasks --all

EDIT: come notato da Radim nei commenti, questo comando non riporta dipendenze, per il grado 3.3 e successivi (vedi https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- rapporto ).


non sembra elencare un'attività per il download di dipendenze dal web da nessuna parte ??? Eseguendo l'attività eclipse scarica chiaramente roba ma non sei sicuro di dove sia quella dipendenza ... non c'è modo di sovraccaricarla?
Dean Hiller,

2
l'azione di scaricare risorse non è vincolata a un'attività dedicata. Le dipendenze in pendenza vengono aggiunte alle configurazioni. Non appena l'utente (nella propria implementazione delle attività) o il gradle (nelle proprie attività fornite) fa riferimento ai file di questa configurazione, viene attivato il meccanismo di risoluzione.
Rene Groeschke,

54
Questo non elenca le dipendenze, almeno con Gradle 1.5 o 1.7. Lo ha fatto una volta o è una risposta incompleta?
Tom Anderson,

10
Funziona solo con pendenza superiore a 3.3. Si è verificato un cambiamento nella segnalazione delle attività che ha rimosso questo output.
Radim,

135

elenca le attività e le attività da cui dipendono (una specie di come la depenenza di Maven: albero ma per attività)

per questo è possibile utilizzare l' opzione --dry-run(o -m) che elenca le attività che vengono eseguite in ordine per un comando particolare, ma non esegue il comando, ad es.

gradle assemble --dry-run

puoi trovare di più qui


2
Questo non elenca un albero delle attività o dipendenze delle attività, elenca solo quali attività sarebbero state eseguite.
bcampolo,

@bcampolo Qual è la differenza?
Kiltek,

39

Puoi provare il plugin com.dorongold.task-tree con un semplice utilizzo:

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

Risultato di esempio dal readme :

gradle build taskTree

:build
+--- :assemble
|    \--- :jar
|         \--- :classes
|              +--- :compileJava
|              \--- :processResources
\--- :check
     \--- :test
          +--- :classes
          |    +--- :compileJava
          |    \--- :processResources
          \--- :testClasses
               +--- :compileTestJava
               |    \--- :classes
               |         +--- :compileJava
               |         \--- :processResources
               \--- :processTestResources

5
Per un risultato più pulito, utilizzare --no-repeat. Fonte: github.com/dorongold/gradle-task-tree
AlikElzin-kilaka,

31

Puoi inserire questo nel tuo 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 questo nel tuo 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")
        }
    }
})

Quindi eseguire l'attività con gradle:

./gradlew build

E dovresti vedere questo:

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

Questo assomiglia un po 'a un grafico, ma è proprio da ciò che dipende ogni attività. È un elenco di nodi con i genitori di ciascun nodo. Quindi, se appare il tuo grafico A <- B <- (C and D), questo ti mostrerà B-A, C-B, D-B. Aiuta ancora alcuni!
Noumenon,

1
Dovrebbe essere un grafico, ma il rendering di un grafico non è banale. L'output del codice sopra elenca solo le dipendenze immediate di un'attività.
cstroe,

15

l'albero delle attività gradle può essere visualizzato gradle tasks --all o provare i seguenti plugin:

Graphs Gradle e Talaiot: esaminare questo: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 blog in quanto elenca graficamente la visualizzazione di attività e dipendenze. Questo utilizza lo strumento gratuito Graphviz Gephi ( https://gephi.org/features/ )

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

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

  1. plug-in gradle-visteg : il file generato può essere post-elaborato tramite l' utilità Graphviz dot .

  2. Ad esempio , l'immagine png viene prodotta come segue:

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

Per ulteriori informazioni, visitare la home page di Graphviz .

Qualunque attività venga effettivamente utilizzata per eseguire un'attività (ad esempio:) buildpuò essere visualizzata in una bella pagina HTML utilizzando l' --profileopzione

Gradle --profile build pulita

Una volta completato, vai alla cartella build / reports / profile e sfoglia il file .html. Vedrai la risoluzione delle dipendenze e altre informazioni con il tempo impiegato in una bella pagina html.


11
Il rapporto non contiene alcuna informazione sulle dipendenze tra le attività. Elenca semplicemente in sequenza tutte le attività eseguite durante la compilazione.
Rwitzel,

7

È possibile accedere a livello di codice al grafico dell'attività per ispezionarlo all'interno dello script di compilazione utilizzando Gradle.getTaskGraph ()


6
gradle.getTaskGraph () mostra solo le attività che verranno eseguite nella build di gradle corrente E questo taskGraph è disponibile solo in fase di esecuzione.
Rene Groeschke,

3

Man mano che il tuo multiprogetto cresce, la soluzione che ho contrassegnato come corretta cresce un po 'complicata e difficile da leggere

gradle tasks --all

Invece, sono passato a guardare un progetto specifico che lo rende molto più semplice

gradlew :full-httpproxy:tasks --all

dove 'full-httpproxy' è il nome del mio progetto (e directory come è tipico).

Tuttavia, sono curioso di sapere come elencare le attività sul progetto master / root e anche qui ho una domanda eccezionale

Come elencare tutte le attività per il progetto principale solo in gradi?

come farlo non sembra possibile in questo momento.



0

In seguito alla risposta di cstroe, di seguito vengono stampati anche i file di input e output di ciascuna attività Gradle. Ciò è utile poiché le dipendenze sono talvolta definite dalle relazioni input / output. Vale a dire, se l'attività B utilizza gli output dell'attività A, la risposta di cstroe non mostrerà la dipendenza. Quanto segue è molto primitivo ma mostra l'elenco dei file di input e output per ogni attività:

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)}
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.