Có cách nào để liệt kê các phụ thuộc nhiệm vụ trong Gradle không?


139

./gradle tasksliệt kê "một số" các nhiệm vụ. Nhìn vào http://gradle.org/docs/civerse/userguide/java_plugin.html có những cái ẩn không được liệt kê. Ngoài ra, các plugin khác sẽ không có một biểu đồ đẹp như vậy về sự phụ thuộc giữa các tác vụ.

Có cách nào để

  1. liệt kê tất cả các tác vụ trong tất cả các plugin với gradle
  2. liệt kê các nhiệm vụ và những nhiệm vụ mà chúng phụ thuộc vào (giống như của maven dependency:treenhưng đối với các nhiệm vụ)

Câu trả lời:


99

bạn có thể sử dụng cờ --all để có danh sách chi tiết hơn về các tác vụ khả dụng và các phụ thuộc nhiệm vụ

gradle tasks --all

EDIT: như Radim đã lưu ý trong các bình luận, lệnh này không báo cáo các phụ thuộc, cho lớp 3.3 và mới hơn (xem https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-t task- báo cáo ).


nó dường như không liệt kê một nhiệm vụ để tải xuống các phụ thuộc từ web ở bất cứ đâu ??? Chạy nhật thực nhiệm vụ tải xuống công cụ rõ ràng nhưng không chắc chắn sự phụ thuộc đó ở đâu ... không có cách nào để quá tải nó?
Dean Hiller

2
hành động tải tài nguyên không bị ràng buộc với một nhiệm vụ chuyên dụng. Phụ thuộc trong lớp được thêm vào Cấu hình. Ngay khi bạn (trong triển khai tác vụ của riêng bạn) hoặc phân lớp (trong các tác vụ được cung cấp riêng) tham chiếu các tệp của cấu hình này, cơ chế phân giải được kích hoạt.
Rene Groeschke

54
Điều này không liệt kê các phụ thuộc, ít nhất là với Lớp 1.5 hoặc 1.7. Có phải là nó đã làm một lần, hoặc đây là một câu trả lời không đầy đủ?
Tom Anderson

10
Chỉ hoạt động cho lớp cũ hơn 3,3. Có một sự thay đổi trong báo cáo nhiệm vụ đã loại bỏ đầu ra này.
Radim

135

liệt kê các nhiệm vụ và những nhiệm vụ mà chúng phụ thuộc vào (giống như depenceny của maven: cây nhưng cho các nhiệm vụ)

Đối với điều này, bạn có thể sử dụng tùy chọn --dry-run(hoặc -m) liệt kê các tác vụ được thực hiện theo lệnh cụ thể, nhưng không thực thi lệnh, ví dụ:

gradle assemble --dry-run

bạn có thể tìm thêm ở đây


2
Điều này không liệt kê một cây nhiệm vụ hoặc phụ thuộc nhiệm vụ, nó chỉ liệt kê những nhiệm vụ nào sẽ được thực hiện.
bcampolo

@bcampolo Sự khác biệt là gì?
kiltek

39

Bạn có thể thử plugin com.dorongold.task-tree với cách sử dụng đơn giản:

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

Kết quả ví dụ từ readme :

gradle build taskTree

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

5
Đối với một đầu ra sạch hơn, sử dụng --no-repeat. Nguồn: github.com/dorongold/gradle-task-tree
AlikElzin-kilaka

30

Bạn có thể dán cái này vào 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
        }
    }
}

hoặc điều này vào 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")
        }
    }
})

Sau đó chạy nhiệm vụ của bạn với gradle:

./gradlew build

Và bạn sẽ thấy điều này:

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

Điều này trông giống như một biểu đồ, nhưng nó thực sự chỉ là những gì mỗi nhiệm vụ phụ thuộc vào. Đây là danh sách các nút có cha mẹ của mỗi nút. Vì vậy, nếu biểu đồ của bạn trông như thế A <- B <- (C and D)này, điều này sẽ cho bạn thấy B-A, C-B, D-B. Nó vẫn giúp một số!
Noumenon

1
Nó phải là một biểu đồ, nhưng hiển thị một biểu đồ là không tầm thường. Đầu ra của đoạn mã trên chỉ liệt kê các phụ thuộc ngay lập tức của một tác vụ.
cstroe

15

cây nhiệm vụ gradle có thể được hình dung bằng gradle tasks --all hoặc thử các plugin sau:

Đồ thị Gradle và Talaiot: Xem xét điều này: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 blog vì nó liệt kê đồ họa xem các nhiệm vụ và phụ thuộc. Công cụ này sử dụng công cụ Graphviz mở miễn phí Gephi ( https://gephi.org/features/ )

cây lớp nhiệm vụ : https://github.com/dorongold/gradle-task-tree

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

  1. plugin gradle-visteg : Tệp được tạo có thể được xử lý hậu kỳ thông qua tiện ích Graphviz dot .

  2. Ví dụ , hình ảnh png được sản xuất như sau:

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

Để biết thêm thông tin, vui lòng truy cập trang chủ của Graphviz .

Bất kỳ tác vụ nào thực sự được sử dụng để chạy một tác vụ (ví dụ build:) có thể được xem trong trang HTML đẹp bằng --profiletùy chọn

gradle --profile xây dựng sạch

Khi việc này hoàn tất, hãy chuyển đến thư mục xây dựng / báo cáo / hồ sơ và duyệt tệp .html. Bạn sẽ thấy độ phân giải phụ thuộc và thông tin khác theo thời gian trong một trang html đẹp.


11
Báo cáo không chứa bất kỳ thông tin nào về sự phụ thuộc giữa các nhiệm vụ. Nó chỉ liệt kê tuần tự tất cả các nhiệm vụ đã được thực hiện trong quá trình xây dựng.
rwitzel

7

Bạn có thể lập trình truy cập vào biểu đồ tác vụ để kiểm tra nó trong tập lệnh xây dựng bằng Gradle.getTaskGraph ()


6
gradle.getTaskGraph () chỉ hiển thị cho bạn các tác vụ sẽ được thực hiện trong bản dựng lớp hiện tại của bạn VÀ tác vụ này chỉ có sẵn ở giai đoạn thực thi.
Rene Groeschke

3

Khi đa hướng của bạn phát triển, giải pháp tôi đánh dấu là chính xác phát triển một chút khó hiểu và khó đọc

gradle tasks --all

Thay vào đó, tôi đã chuyển sang xem xét một dự án cụ thể làm cho nó dễ dàng hơn nhiều

gradlew :full-httpproxy:tasks --all

trong đó 'full-omeproxy' là tên dự án của tôi (và thư mục là điển hình).

Tuy nhiên tôi tò mò làm thế nào để liệt kê các nhiệm vụ trên dự án master / root và cũng có một câu hỏi nổi bật ở đây

Làm thế nào để liệt kê tất cả các nhiệm vụ cho dự án tổng thể chỉ trong lớp?

như làm điều đó dường như không thể ngay bây giờ.



0

Theo câu trả lời của cstroe, phần sau cũng in các tệp đầu vào và đầu ra của mỗi tác vụ Gradle. Điều này rất hữu ích vì đôi khi phụ thuộc được xác định bởi quan hệ đầu vào / đầu ra. Tức là, nếu tác vụ B sử dụng kết quả đầu ra của nhiệm vụ A, câu trả lời của cstroe sẽ không cho bạn thấy sự phụ thuộc. Dưới đây là rất nguyên thủy nhưng hiển thị danh sách các tệp đầu vào và đầu ra cho mỗi tác vụ:

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)}
    }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.