การรีเซ็ตคุณสมบัติ UP-TO-DATE ของงาน gradle?


107

มีวิธีใดบ้างที่ฉันสามารถบังคับให้งาน gradle ทำงานอีกครั้งหรือรีเซ็ตงานทั้งหมดกลับสู่สถานะที่ไม่ใช่ UP-TO-DATE

คำตอบ:


136

พยายามเรียกใช้งานสร้างของคุณด้วย -C rebuildบิลด์ของคุณด้วยแคชของ Gradle ที่สร้างขึ้นใหม่

ใน Gradle เวอร์ชันใหม่ให้ใช้ --rerun-tasks


89

หากคุณต้องการเพียงแค่งานเดียวเพื่อรันเสมอคุณสามารถตั้งค่าoutputsคุณสมบัติภายในงานได้

outputs.upToDateWhen { false }

โปรดทราบว่าหากงานของคุณไม่มีอินพุตไฟล์ที่กำหนดไว้ Gradle อาจข้ามงานแม้ว่าจะใช้โค้ดด้านบนก็ตาม ตัวอย่างเช่นในงาน Zip หรือ Copy จำเป็นต้องมีไฟล์อย่างน้อยหนึ่งไฟล์ที่จัดเตรียมไว้ในขั้นตอนการกำหนดค่าของนิยามงาน


14
นี้ไม่ได้อะไรสำหรับฉัน ฉันเพิ่มมันลงในงานและรับ "UP-TO-DATE" สิ่งที่ตลกคือมันเป็น ZipTask และฉันลบที่เก็บปลายทาง
maaartinus

5
นี่เป็นเรื่องเหลือเชื่อสำหรับการใช้งานเช่นนี้tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.

คำตอบที่อัปเดตสำหรับกรณีที่งานจะไม่ทำงาน
cmcginty

ระวังว่าในปัจจุบันนี้เมื่อเปิดใช้งานแคชที่สร้างขึ้นของ gradle สิ่งนี้จะไม่ทำให้งานทำงานอีกครั้ง แต่เอาต์พุตจะถูกเรียกคืนจากแคช
Stephen Friedrich

25

คุณสามารถใช้ได้ cleanTaskname

สมมติว่าคุณมี

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

และคุณต้องการบังคับให้สมมติว่า something2 ทำงานอีกครั้งคุณทำได้

someproject:cleanSometask2

ก่อนที่คุณจะรันงานที่รันมันทั้งหมด

เห็นได้ชัดว่าใน gradle ทุกงานที่เข้าใจ UP-TO-DATE ยังเข้าใจวิธีทำความสะอาดตัวเอง


1
'gradle clean' จะล้างทุกอย่างสำหรับโปรเจ็กต์ที่คุณอยู่โดยทั่วไปจะลบโฟลเดอร์ผลลัพธ์หลักของคุณซึ่งเป็น '/ build' ตามค่าเริ่มต้น นี่คือสิ่งที่คุณกำลังมองหาใช่ไหม
c_maker

6
ไม่สิ่งนี้จะไม่ตั้งค่าให้เป็นปัจจุบันใหม่หากจับภาพข้อมูลล่าสุดว่าไม่มีไฟล์เอาต์พุตสำหรับงานที่กำหนด นั่นคือถ้าฉันมีบางส่วนของการแบ่งบิวด์ แต่ประสบความสำเร็จโดยรวมสถานะที่ถูกจับนั้นผิดและฉันจำเป็นต้องล้างมัน
Stefan Kendall

1
โดยปกติงาน 'clean' ที่ลบ everyting ใน $ buildDir จะมีอยู่ในบิลด์สคริปต์ตามที่ปลั๊กอินพื้นฐานแนะนำ
Rene Groeschke

5

ฉันมีกรณีที่ยากลำบากที่การตั้งค่าoutputs.upToDateWhen { false }ภายในงานหรือการเพิ่มแฟล็ก--rerun-tasksไม่ได้ช่วยเนื่องจากงานsetOnlyIfจะถูกตั้งค่าไว้falseทุกครั้งที่ฉันรัน

เพิ่มต่อไปนี้เพื่อbuild.gradleบังคับให้ดำเนินการ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 }
    }
  }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.