Existe uma maneira de listar dependências de tarefas em Gradle?

139

./gradle taskslista "algumas" das tarefas. Olhando http://gradle.org/docs/current/userguide/java_plugin.html, existem ocultos não listados. Além disso, outros plugins não terão um gráfico bonito e agradável das dependências entre as tarefas.

Existe uma maneira de

  1. listar todas as tarefas em todos os plugins com gradle
  2. liste as tarefas e de que tarefas elas dependem (como as de maven, dependency:treemas para tarefas)
Dean Hiller
fonte

Respostas:

99

você pode usar o sinalizador --all para obter uma lista mais detalhada das tarefas disponíveis e das dependências da tarefa

gradle tasks --all

EDIT: conforme observado por Radim nos comentários, este comando não relata dependências, para o gradle 3.3 e mais recente (consulte https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- relatório ).

Rene Groeschke
fonte
parece não listar uma tarefa para baixar dependências da web em qualquer lugar ??? A execução do eclipse de tarefas faz o download claro de coisas, mas não tem certeza de onde está essa dependência ... não há como sobrecarregá-la?
Dean Hiller
2
a ação de baixar recursos não está vinculada a uma tarefa dedicada. Dependências em gradle são adicionadas às configurações. Assim que você (em sua própria implementação de tarefa) ou gradle (em suas próprias tarefas fornecidas) referenciar os arquivos dessa configuração, o mecanismo de resolução será acionado.
Rene Groeschke
54
Isso não lista as dependências, pelo menos no Gradle 1.5 ou 1.7. Será que uma vez fez isso ou é uma resposta incompleta?
Tom Anderson
10
Funciona apenas para gradle com mais de 3,3. Houve uma alteração no relatório de tarefas que removeu essa saída.
Radim 12/09
135

liste as tarefas e de que tarefas elas dependem (como a depenceny de maven: tree, mas para tarefas)

para isso, você pode usar a opção --dry-run(ou -m) que lista as tarefas executadas em ordem para um comando específico, mas não executa o comando, por exemplo

gradle assemble --dry-run

você pode encontrar mais aqui

Marko Vranjkovic
fonte
2
Isso não lista uma árvore de tarefas ou dependências de tarefas, apenas lista quais tarefas teriam sido executadas.
bcampolo
@bcampolo Qual é a diferença?
kiltek
39

Você pode tentar o plug- in com.dorongold.task-tree com o uso simples:

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

Exemplo de resultado do leia - me :

gradle build taskTree

:build
+--- :assemble
|    \--- :jar
|         \--- :classes
|              +--- :compileJava
|              \--- :processResources
\--- :check
     \--- :test
          +--- :classes
          |    +--- :compileJava
          |    \--- :processResources
          \--- :testClasses
               +--- :compileTestJava
               |    \--- :classes
               |         +--- :compileJava
               |         \--- :processResources
               \--- :processTestResources
Oleksandr
fonte
5
Para uma saída mais limpa, use --no-repeat. Fonte: github.com/dorongold/gradle-task-tree
AlikElzin-Kilaka
30

Você pode colocar isso no seu 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
        }
    }
}

ou isso em seu 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")
        }
    }
})

Em seguida, execute sua tarefa com gradle:

./gradlew build

E você deve ver isso:

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
fonte
Isso parece um pouco com um gráfico, mas é realmente exatamente do que cada tarefa depende. É uma lista de nós com os pais de cada nó. Portanto, se seu gráfico se parecer A <- B <- (C and D), isso mostrará a você B-A, C-B, D-B. Ainda ajuda alguns!
Noumenon
1
Deve ser um gráfico, mas a renderização de um gráfico não é trivial. A saída do código acima apenas lista as dependências imediatas de uma tarefa.
cstroe 10/07
15

A árvore de tarefas gradle pode ser visualizada por gradle tasks --all ou tente os seguintes plugins:

Gráficos Gradle e Talaiot: analise o seguinte: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 blog, que lista tarefas e dependências de visualização gráfica. Ele usa a ferramenta gratuita Graphviz aberta 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. plugin gradle-visteg : o arquivo gerado pode ser pós-processado através do utilitário Graphviz dot .

  2. Por exemplo , a imagem png é produzida da seguinte maneira:

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

Para mais informações, visite a página inicial do Graphviz .

Quaisquer que sejam as tarefas realmente usadas para executar uma tarefa (por exemplo:), buildpodem ser visualizadas em uma boa página HTML usando a --profileopção

Gradle --profile compilação limpa

Quando isso estiver concluído, vá para a pasta build / reports / profile e procure o arquivo .html. Você verá a resolução de dependências e outras informações com o tempo que levou em uma boa página html.

AKS
fonte
11
O relatório não contém nenhuma informação sobre as dependências entre tarefas. Ele apenas lista sequencialmente todas as tarefas que foram executadas durante a compilação.
Rwitzel
7

Você pode acessar programaticamente o gráfico de tarefas para inspecioná-lo no script de construção usando Gradle.getTaskGraph ()

Dylan Bijnagte
fonte
6
gradle.getTaskGraph () mostra apenas as tarefas que serão executadas em sua compilação atual de gradle E esse taskGraph está disponível apenas na fase de execução.
Rene Groeschke
3

À medida que o seu multiprojeto cresce, a solução que marquei como correta se torna um pouco insana e difícil de ler

gradle tasks --all

Em vez disso, passei a olhar para um projeto específico, tornando muito mais fácil

gradlew :full-httpproxy:tasks --all

onde 'full-httpproxy' é o nome do meu projeto (e diretório como é típico).

No entanto, estou curioso para saber como listar tarefas no projeto mestre / raiz e também tenho uma pergunta excelente aqui

Como listar todas as tarefas do projeto mestre apenas em gradle?

como fazer isso não parece possível no momento.

Dean Hiller
fonte
0

Após a resposta do cstroe, o seguinte também imprime os arquivos de entrada e saída de cada tarefa Gradle. Isso é útil, pois as dependências às vezes são definidas por relações de entrada / saída. Ou seja, se a tarefa B usar as saídas da tarefa A, a resposta da cstroe não mostrará a dependência. A seguir, é muito primitivo, mas mostra a lista de arquivos de entrada e saída para cada tarefa:

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
fonte