Menyetel ulang properti UP-TO-DATE tugas gradle?

106

Adakah cara agar saya dapat memaksa tugas gradle untuk dijalankan lagi, atau mengatur ulang semua tugas kembali ke status bukan UP-TO-DATE?

Stefan Kendall
sumber

Jawaban:

133

Coba jalankan build Anda yang akan membangun -C rebuildkembali cache Gradle.

Di versi Gradle yang lebih baru, gunakan --rerun-tasks

Rene Groeschke
sumber
89

Jika Anda hanya ingin satu tugas untuk selalu dijalankan, Anda dapat menyetel outputsproperti di dalam tugas.

outputs.upToDateWhen { false }

Perlu diketahui bahwa jika tugas Anda tidak memiliki input file yang ditentukan, Gradle dapat melewati tugas tersebut, bahkan saat menggunakan kode di atas. Misalnya, dalam tugas Zip atau Salin harus ada setidaknya satu file yang disediakan dalam fase konfigurasi definisi tugas.

cmcginty.dll
sumber
14
Ini tidak melakukan apa-apa bagi saya. Saya menambahkannya ke tugas dan mendapatkan "UP-TO-DATE". Lucunya, ini adalah ZipTask dan saya menghapus arsip tujuan.
maaartinus
5
Ini luar biasa untuk penggunaan seperti ini:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.
Jawaban yang diperbarui untuk kasus ketika tugas tidak akan berjalan.
cmcginty
Berhati-hatilah bahwa saat ini, jika cache bawaan gradle diaktifkan, ini tidak akan menyebabkan tugas dijalankan lagi, tetapi hasilnya hanya akan dipulihkan dari cache.
Stephen Friedrich
25

Kamu bisa memakai cleanTaskname

Katakanlah Anda punya

:someproject:sometask1 UP-TO-DATE
:someproject:sometask2 UP-TO-DATE
:someproject:sometask3 UP-TO-DATE

Dan Anda ingin memaksa katakanlah sesuatu harus berjalan lagi, Anda bisa

someproject:cleanSometask2

sebelum Anda menjalankan tugas yang menjalankan semuanya.

Ternyata di gradle, setiap tugas yang paham UP-TO-DATE juga paham cara membersihkan dirinya.

c_maker
sumber
1
'gradle clean' akan membersihkan semua proyek yang Anda masuki. Ini pada dasarnya menghapus folder keluaran utama Anda yang merupakan '/ build' secara default. Apakah ini yang Anda cari?
c_maker
6
Tidak. Itu tidak akan mengatur ulang up-to-date jika up-to-date ditangkap karena tidak ada file keluaran untuk tugas tertentu. Artinya, jika saya memiliki beberapa bagian dari build break tetapi berhasil secara keseluruhan, status yang ditangkap salah, dan saya perlu menghapusnya.
Stefan Kendall
1
biasanya tugas 'bersih' yang menghapus everyting di $ buildDir tersedia dalam skrip build seperti yang diperkenalkan oleh plugin dasar.
Rene Groeschke
5

Saya mengalami kasus sulit di mana pengaturan outputs.upToDateWhen { false }di dalam tugas atau menambahkan bendera --rerun-taskstidak membantu karena tugas setOnlyIfterus diatur ke falsesetiap kali saya menjalankannya.

Menambahkan berikut ini untuk build.gradlememaksa eksekusi myTask:

gradle.taskGraph.whenReady { taskGraph ->
  def tasks = taskGraph.getAllTasks()
  tasks.each {
    def taskName = it.getName()
    if(taskName == 'myTask') {
      println("Found $taskName")

      it.setOnlyIf { true }
      it.outputs.upToDateWhen { false }
    }
  }
}
Matthias Braun
sumber