Gradle에 작업 종속성을 나열하는 방법이 있습니까?


139

./gradle tasks작업 중 "일부"를 나열합니다. http://gradle.org/docs/current/userguide/java_plugin.html을 보면 보이지 않는 숨겨진 것들이 있습니다. 또한 다른 플러그인에는 작업 간의 종속성에 대한 멋진 그래프가 없습니다.

방법이 있습니까

  1. gradle을 사용하여 모든 플러그인의 모든 작업을 나열하십시오.
  2. 작업과 그들이 의존하는 작업을 나열하십시오 (maven과 비슷 dependency:tree하지만 작업을위한 것)

답변:


99

--all 플래그를 사용하여 사용 가능한 작업 및 작업 종속성에 대한 자세한 목록을 얻을 수 있습니다.

gradle tasks --all

편집 : 의견에서 Radim이 지적한 것처럼이 명령은 gradle 3.3 이상에 대한 종속성을보고하지 않습니다 ( https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- 보고서 ).


어디서나 웹에서 종속성을 다운로드하는 작업을 나열하지 않는 것 같습니다 ?? 작업 일식을 실행하면 물건을 명확하게 다운로드하지만 그 의존성이 어디에 있는지 확실하지 않습니다 ... 오버로드 할 방법이 없습니까?
Dean Hiller 2016 년

2
리소스 다운로드 작업은 전용 작업에 바인딩되지 않습니다. gradle의 종속성이 구성에 추가됩니다. 자신의 작업 구현에서 또는 gradle (제공된 작업에서)이이 구성의 파일을 참조하자마자 해결 메커니즘이 트리거됩니다.
Rene Groeschke 2016 년

54
이것은 Gradle 1.5 또는 1.7과의 종속성을 나열하지 않습니다. 한 번 그렇게 했습니까, 아니면 불완전한 대답입니까?
Tom Anderson

10
3.3보다 오래된 gradle에서만 작동합니다. 이 결과를 제거하는 작업보고 가 변경되었습니다 .
Radim

135

작업과 그들이 의존하는 작업을 나열하십시오 (maven의 depenceny : tree와 같지만 작업을위한 것)

이를 위해 당신은 사용할 수 있습니다 --dry-run-m 위해 특정 명령에 대해 실행되지만 명령을 실행하지 않는 작업을 나열 (또는 ) 옵션을

gradle assemble --dry-run

여기서 더 찾을 수 있습니다


2
이것은 작업 트리 나 작업 종속성을 나열하지 않고 실행 된 작업 만 나열합니다.
bcampolo

@bcampolo 차이점은 무엇입니까?
kiltek

39

간단한 사용법으로 com.dorongold.task-tree 플러그인을 사용해 볼 수 있습니다.

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

readme의 결과 예 :

gradle build taskTree

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

5
보다 깨끗한 출력을 위해을 사용하십시오 --no-repeat. 출처 : github.com/dorongold/gradle-task-tree
AlikElzin-kilaka '

30

이것을 당신의 것으로 붙일 수 있습니다 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
        }
    }
}

또는 이것으로 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")
        }
    }
})

그런 다음 gradle로 작업을 실행하십시오.

./gradlew build

그리고 당신은 이것을 볼 것입니다 :

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

이것은 그래프와 비슷하지만 실제로는 각 작업이 의존하는 것입니다. 각 노드의 부모가있는 노드 목록입니다. 따라서 그래프가 다음과 같이 A <- B <- (C and D)표시 B-A, C-B, D-B됩니다. 여전히 도움이됩니다!
누 메논

1
그래프 여야하지만 그래프를 렌더링하는 것은 쉽지 않습니다. 위 코드의 출력은 작업의 즉각적인 종속성을 보여줍니다.
15:08에

15

gradle 작업 트리는 다음 플러그인 으로 시각화 gradle tasks --all 하거나 시도 할 수 있습니다 .

그래프 Gradle을하고 Talaiot : 이 조사 : https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 블로그는 그래픽 작업 및 종속성을 볼 나열한다. 이것은 무료 오픈 Graphviz 도구 Gephi를 사용합니다 ( https://gephi.org/features/ )

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

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

  1. gradle-visteg 플러그인 : 생성 된 파일은 Graphviz dot 유틸리티 를 통해 사후 처리 할 수 ​​있습니다 .

  2. 예를 들어 , png 이미지는 다음과 같이 생성됩니다.

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

자세한 내용은 Graphviz 홈페이지 를 방문 하십시오.

실제로 작업을 실행하는 데 사용 된 작업 (예 :) build은 다음을 사용하여 멋진 HTML 페이지에서 볼 수 있습니다--profile 옵션을

Gradle을 --profile 정리 빌드

이 작업이 완료되면 build / reports / profile 폴더로 이동하여 .html 파일을 찾으십시오. 좋은 html 페이지에서 시간이 지남에 따라 종속성 해결 및 기타 정보가 표시됩니다.


11
보고서에는 작업 간의 종속성에 대한 정보가 없습니다. 빌드 중에 실행 된 모든 작업이 순차적으로 나열됩니다.
rwitzel

7

프로그래밍 방식으로 작업 그래프에 액세스하여 Gradle.getTaskGraph ()를 사용하여 빌드 스크립트 내에서 작업 그래프를 검사 할 수 있습니다.


6
gradle.getTaskGraph ()는 현재 gradle 빌드에서 실행될 작업 만 보여 주며이 taskGraph는 실행 단계에서만 사용할 수 있습니다.
Rene Groeschke 2016 년

3

다중 프로젝트가 커짐에 따라 내가 올바른 것으로 표시 한 솔루션은 약간 부실하고 읽기 어려워집니다

gradle tasks --all

대신 특정 프로젝트를 살펴 보는 것이 훨씬 쉬워졌습니다.

gradlew :full-httpproxy:tasks --all

여기서 'full-httpproxy'는 내 프로젝트 이름이며 일반적인 디렉토리입니다.

그러나 마스터 / 루트 프로젝트에 작업을 나열하는 방법이 궁금하고 여기에서도 눈에 띄는 질문이 있습니다.

마스터 프로젝트의 모든 작업을 gradle로만 나열하는 방법은 무엇입니까?

지금은 불가능한 것 같습니다.



0

cstroe의 답변에 이어 다음은 각 Gradle 작업의 입력 및 출력 파일도 인쇄합니다. 종속성은 때때로 입력 / 출력 관계에 의해 정의되기 때문에 유용합니다. 즉, 작업 B가 작업 A의 출력을 사용하는 경우 cstroe의 답변에 종속성이 표시되지 않습니다. 다음은 매우 원시적이지만 각 작업의 입력 및 출력 파일 목록을 보여줍니다.

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)}
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.