Gradle'da görev bağımlılıklarını listelemenin bir yolu var mı?


139

./gradle tasksgörevlerin "bazılarını" listeler. Baktığımızda http://gradle.org/docs/current/userguide/java_plugin.html listede yok gizli olanlar vardır. Ayrıca, diğer eklentiler, görevler arasındaki bağımlılıkların hoş bir grafiğine sahip olmayacaktır.

İçin bir yol var mı

  1. tüm eklentilerdeki tüm görevleri derecelendirme ile listele
  2. görevleri ve hangi görevlere bağlı olduklarını listeler (bir çeşit maaven gibi dependency:treeama görevler için)

Yanıtlar:


99

kullanılabilir görevlerin ve görev bağımlılıklarının daha ayrıntılı bir listesini almak için --all bayrağını kullanabilirsiniz

gradle tasks --all

EDIT: Radim tarafından yorumlarda belirtildiği gibi, bu komut sınıf 3.3 ve daha yeni sürümler için bağımlılıkları rapor etmez (bkz. Https://docs.gradle.org/3.3/release-notes.html#improved-performance-of-tasks- rapor ).


herhangi bir yerde web'den bağımlılıkları indirmek için bir görev listelenmiyor gibi görünüyor ??? Görev tutulması açık bir şekilde indirmek şeyler ama bu bağımlılığın nerede olduğundan emin değilsiniz ... aşırı yüklemek için bir yolu yok?
Dean Hiller

2
kaynak indirme eylemi özel bir göreve bağlı değildir. Sınıftaki bağımlılıklar Konfigürasyonlara eklenir. Siz (kendi görev uygulamanızda) veya sınıf (kendi sağlanan görevlerinde) bu yapılandırmanın dosyalarına başvurur başvurmaz, çözümleme mekanizması tetiklenir.
Rene Groeschke

54
Bu en azından Gradle 1.5 veya 1.7 ile bağımlılıkları listelemez. Bunu bir kez yaptı mı yoksa eksik bir cevap mı?
Tom Anderson

10
Yalnızca 3.3'ten daha eski olan gradle için çalışır. Görev raporlamasında bu çıktıyı kaldıran bir değişiklik oldu .
Radim

135

görevleri ve hangi görevlere bağlı olduklarını listeler (bir çeşit maven'in bağımlılığı gibi: ağaç ama görevler için)

bunun için belirli bir komut için yürütülen, ancak komutu yürütmeyen görevleri listeleyen --dry-run(veya -m) seçeneğini kullanabilirsiniz , örn.

gradle assemble --dry-run

burada daha fazlasını bulabilirsiniz


2
Bu bir görev ağacını veya görev bağımlılıklarını listelemez, sadece hangi görevlerin yürütüleceğini listeler.
bcampolo

@bcampolo Fark nedir?
kiltek

39

Basit kullanımla com.dorongold.task-tree eklentisini deneyebilirsiniz :

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

Benioku dosyasının sonucu :

gradle build taskTree

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

5
Daha temiz bir çıktı için kullanın --no-repeat. Kaynak: github.com/dorongold/gradle-task-tree
AlikElzin-kilaka

31

Bunu içine yapıştırabilirsiniz 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
        }
    }
}

ya bu senin içine 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")
        }
    }
})

Ardından görevinizi gradle ile çalıştırın:

./gradlew build

Ve şunu görmelisin:

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

Bu biraz bir grafiğe benziyor, ama gerçekten her görevin bağlı olduğu şey. Her düğümün ebeveynleri ile düğümlerin bir listesi. Grafiğinize benziyorsa A <- B <- (C and D), bu size gösterecektir B-A, C-B, D-B. Hala bazı yardımcı olur!
Noumenon

1
Bir grafik olmalı, ancak bir grafiği oluşturmak önemsiz değildir. Yukarıdaki kodun çıktısı sadece bir görevin anında bağımlılıklarını listeler.
cstroe

15

sınıf görev ağacı aşağıdaki eklentiler ile görselleştirilebilir gradle tasks --all veya deneyin:

Grafikler Gradle ve Talaiot: Şuna göz atın: https://proandroiddev.com/graphs-gradle-and-talaiot-b0c02c50d2b1 blogu grafiksel olarak görüntüleme görevlerini ve bağımlılıkları listeler. Bu ücretsiz açık Graphviz aracı Gephi kullanır ( https://gephi.org/features/ )

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

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

  1. gradle-visteg eklentisi: Oluşturulan dosya Graphviz dot yardımcı programı ile sonradan işlenebilir .

  2. Örneğin , png resmi aşağıdaki gibi üretilir:

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

Daha fazla bilgi için lütfen Graphviz ana sayfasını ziyaret edin .

Bir görevi çalıştırmak için gerçekte kullanılan görevler (ör. İçin build) --profileseçeneği kullanılarak güzel HTML sayfasında görüntülenebilir

gradle --profile temiz inşa

Bu tamamlandığında, build / report / profile klasörüne gidin ve .html dosyasına göz atın. Bağımlılıkların çözünürlüğünü ve diğer bilgileri güzel bir html sayfasında aldığı zamanla göreceksiniz.


11
Rapor, görevler arasındaki bağımlılıklar hakkında herhangi bir bilgi içermiyor. Sadece derleme sırasında yürütülen tüm görevleri sırayla listeler.
rwitzel

7

Gradle.getTaskGraph () kullanarak yapı grafiğinde incelemek için görev grafiğine programlı olarak erişebilirsiniz.


6
gradle.getTaskGraph () yalnızca geçerli sınıf oluşturma işleminizde yürütülecek görevleri gösterir VE bu taskGraph yalnızca yürütme aşamasında kullanılabilir.
Rene Groeschke

3

Çok projeniz büyüdükçe, doğru olarak işaretlediğim çözüm biraz garip ve okunması zorlaşıyor

gradle tasks --all

Bunun yerine, çok daha kolay hale getiren belirli bir projeye bakmaya geçtim

gradlew :full-httpproxy:tasks --all

burada 'full-httpproxy' projemin adıdır (ve tipik olarak dizin).

Ancak ana / kök projedeki görevleri nasıl listeleyeceğimi merak ediyorum ve burada da olağanüstü bir sorum var

Ana proje için tüm görevler sadece notta nasıl listelenir?

çünkü bunu yapmak şu anda mümkün görünmüyor.



0

Cstroe tarafından verilen cevabı takiben, aşağıda her Gradle görevinin giriş ve çıkış dosyaları yazdırılır. Bağımlılıklar bazen girdi / çıktı ilişkileri tarafından tanımlandığından bu yararlıdır. Yani, B görevi A görevinin çıktılarını kullanıyorsa, sunucunun cevabı size bağımlılığı göstermez. Aşağıdakiler çok ilkeldir, ancak her görev için giriş ve çıkış dosyalarının listesini gösterir:

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)}
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.