Apakah ada cara untuk mencantumkan dependensi tugas di Gradle?

141

./gradle tasksmembuat daftar "beberapa" tugas. Melihat http://gradle.org/docs/current/userguide/java_plugin.html ada yang tersembunyi yang tidak terdaftar. Selain itu, plugin lain tidak akan memiliki grafik dependensi yang bagus di antara tugas.

Apakah ada cara untuk melakukannya

  1. daftar semua tugas di semua plugin dengan gradle
  2. daftar tugas dan tugas apa yang mereka andalkan (seperti maven dependency:treetetapi untuk tugas)
Dean Hiller
sumber

Jawaban:

100

Anda bisa menggunakan --all flag untuk mendapatkan daftar tugas yang tersedia dan dependensi tugas yang lebih detail

gradle tasks --all

EDIT: seperti dicatat oleh Radim di komentar, perintah ini tidak melaporkan dependensi, untuk gradle 3.3 dan yang lebih baru (lihat https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- laporan ).

Rene Groeschke
sumber
sepertinya tidak mencantumkan tugas untuk mengunduh dependensi dari web di mana pun ??? Menjalankan tugas gerhana dengan jelas mengunduh barang tetapi tidak yakin di mana ketergantungan itu ... tidak ada cara untuk membebani itu?
Dean Hiller
2
tindakan mengunduh sumber daya tidak terikat pada tugas khusus. Dependensi dalam gradle ditambahkan ke Konfigurasi. Segera setelah Anda (dalam implementasi tugas Anda sendiri) atau gradle (dalam tugasnya sendiri yang disediakan) mereferensikan file konfigurasi ini, mekanisme penyelesaian dipicu.
Rene Groeschke
54
Ini tidak mencantumkan dependensi, setidaknya dengan Gradle 1.5 atau 1.7. Apakah ia pernah melakukannya, atau apakah ini jawaban yang tidak lengkap?
Tom Anderson
10
Bekerja untuk gradle yang lebih tua dari 3.3 saja. Ada perubahan dalam pelaporan tugas yang menghapus keluaran ini.
Radim
145

daftar tugas dan tugas apa yang mereka andalkan (seperti depenceny maven: pohon tetapi untuk tugas)

untuk ini, Anda dapat menggunakan --dry-run(atau -m) opsi yang mencantumkan tugas yang dijalankan untuk perintah tertentu, tetapi tidak menjalankan perintah, mis.

gradle assemble --dry-run

Anda dapat menemukan lebih banyak di sini

Marko Vranjkovic
sumber
4
Ini tidak mencantumkan pohon tugas atau dependensi tugas, ini hanya mencantumkan tugas mana yang akan dieksekusi.
bcampolo
@bcampolo Apa bedanya?
kiltek
42

Anda dapat mencoba plugin com.dorongold.task-tree dengan penggunaan sederhana:

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

Contoh hasil dari readme :

gradle build taskTree

:build
+--- :assemble
|    \--- :jar
|         \--- :classes
|              +--- :compileJava
|              \--- :processResources
\--- :check
     \--- :test
          +--- :classes
          |    +--- :compileJava
          |    \--- :processResources
          \--- :testClasses
               +--- :compileTestJava
               |    \--- :classes
               |         +--- :compileJava
               |         \--- :processResources
               \--- :processTestResources
Oleksandr
sumber
5
Untuk hasil yang lebih bersih, gunakan --no-repeat. Sumber: github.com/dorongold/gradle-task-tree
AlikElzin-kilaka
35

Anda dapat memasukkan ini ke dalam 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
        }
    }
}

atau ini ke Anda 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")
        }
    }
})

Kemudian jalankan tugas Anda dengan gradle:

./gradlew build

Dan Anda akan melihat ini:

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
sumber
Ini terlihat seperti grafik, tetapi sebenarnya tergantung pada setiap tugas. Ini adalah daftar node dengan orang tua dari setiap node. Jadi jika grafik Anda terlihat seperti A <- B <- (C and D)ini, ini akan menunjukkan kepada Anda B-A, C-B, D-B. Ini masih membantu beberapa!
Noumenon
1
Ini harus berupa grafik, tetapi merender grafik bukanlah hal yang sepele. Output dari kode di atas hanya mencantumkan dependensi langsung dari suatu tugas.
cstroe
15

pohon tugas gradle dapat divisualisasikan dengan gradle tasks --all atau mencoba plugin berikut:

Grafik Gradle dan Talaiot: Lihat ini: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 blog karena mencantumkan tugas dan dependensi yang dilihat secara grafis. Ini menggunakan alat Graphviz terbuka gratis Gephi ( https://gephi.org/features/ )

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

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

  1. plugin gradle-visteg : File yang dihasilkan dapat diproses setelahnya melalui dotutilitas Graphviz .

  2. Misalnya , gambar png dihasilkan sebagai berikut:

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

Untuk informasi lebih lanjut, silakan kunjungi halaman muka Graphviz .

Tugas apa pun yang sebenarnya digunakan untuk menjalankan tugas (misalnya build:) dapat dilihat di halaman HTML yang bagus menggunakan --profileopsi

gradle --profile clean build

Setelah ini selesai, buka folder build / reports / profile dan telusuri file .html. Anda akan melihat resolusi dependensi dan info lainnya dengan waktu yang dibutuhkan di halaman html yang bagus.

AKS
sumber
12
Laporan tidak berisi informasi apa pun tentang dependensi antar tugas. Itu hanya mencantumkan secara berurutan semua tugas yang dijalankan selama pembuatan.
rwitzel
7

Anda dapat mengakses grafik tugas secara terprogram untuk memeriksanya dalam skrip build menggunakan Gradle.getTaskGraph ()

Dylan Bijnagte
sumber
6
gradle.getTaskGraph () tidak hanya menampilkan tugas yang akan dijalankan dalam build gradle Anda saat ini DAN taskGraph ini hanya tersedia pada fase eksekusi.
Rene Groeschke
3

Saat multiproyek Anda berkembang, solusi yang saya tandai sebagai benar tumbuh sedikit tidak lemah dan sulit dibaca

gradle tasks --all

Sebaliknya, saya telah beralih untuk melihat proyek tertentu sehingga lebih mudah

gradlew :full-httpproxy:tasks --all

di mana 'full-httpproxy' adalah nama proyek saya (dan direktori seperti biasa).

Namun saya penasaran bagaimana membuat daftar tugas pada proyek master / root dan memiliki pertanyaan yang luar biasa di sini juga

Bagaimana cara mencantumkan semua tugas untuk proyek master hanya di gradle?

karena melakukan itu sepertinya tidak mungkin sekarang.

Dean Hiller
sumber
1

Mengikuti jawaban oleh cstroe, berikut ini juga mencetak file input dan output dari setiap tugas Gradle. Ini berguna karena dependensi terkadang ditentukan oleh hubungan input / output. Yaitu, jika tugas B menggunakan keluaran dari tugas A, jawaban cstroe tidak akan menunjukkan ketergantungannya. Berikut ini sangat primitif tetapi menampilkan daftar file input dan output untuk setiap tugas:

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
sumber
0

Ada plugin baru untuk ini:

plugins {
    id 'org.barfuin.gradle.taskinfo' version '1.0.1'
}

Kemudian Anda bisa mengetik:

./gradlew tiTree assemble

dan dapatkan sesuatu seperti ini:

:assemble                             (org.gradle.api.DefaultTask)
+--- :jar                             (org.gradle.api.tasks.bundling.Jar)
|    `--- :classes                    (org.gradle.api.DefaultTask)
|         +--- :compileJava           (org.gradle.api.tasks.compile.JavaCompile)
|         `--- :processResources      (org.gradle.language.jvm.tasks.ProcessResources)
+--- :javadocJar                      (org.gradle.api.tasks.bundling.Jar)
|    `--- :javadoc                    (org.gradle.api.tasks.javadoc.Javadoc)
|         `--- :classes               (org.gradle.api.DefaultTask)
|              +--- :compileJava      (org.gradle.api.tasks.compile.JavaCompile)
|              `--- :processResources (org.gradle.language.jvm.tasks.ProcessResources)
`--- :sourcesJar                      (org.gradle.api.tasks.bundling.Jar)

Plugin juga dapat menunjukkan urutan tugas yang akan dijalankan:

In order to execute task ':assemble', the following tasks would be executed in this order:

  1. :compileJava      (org.gradle.api.tasks.compile.JavaCompile)
  2. :processResources (org.gradle.language.jvm.tasks.ProcessResources)
  3. :classes          (org.gradle.api.DefaultTask)
  4. :jar              (org.gradle.api.tasks.bundling.Jar)
  5. :javadoc          (org.gradle.api.tasks.javadoc.Javadoc)
  6. :javadocJar       (org.gradle.api.tasks.bundling.Jar)
  7. :sourcesJar       (org.gradle.api.tasks.bundling.Jar)
  8. :assemble         (org.gradle.api.DefaultTask)

Info selengkapnya ada di dokumen plugin .
Pengungkapan penuh: Saya penulis gradle-taskinfo.

barfuin
sumber