Có cách nào để tôi có thể buộc một nhiệm vụ gradle chạy lại hoặc đặt lại tất cả các nhiệm vụ trở lại trạng thái KHÔNG CẬP NHẬT KHÔNG?
Có cách nào để tôi có thể buộc một nhiệm vụ gradle chạy lại hoặc đặt lại tất cả các nhiệm vụ trở lại trạng thái KHÔNG CẬP NHẬT KHÔNG?
Câu trả lời:
Cố gắng chạy bản dựng của bạn với -C rebuild
bộ nhớ cache của Gradle đã xây dựng lại.
Trong các phiên bản mới hơn của Gradle, hãy sử dụng --rerun-tasks
Nếu bạn muốn chỉ một tác vụ duy nhất luôn chạy, bạn có thể đặt thuộc outputs
tính bên trong tác vụ.
outputs.upToDateWhen { false }
Xin lưu ý rằng nếu tác vụ của bạn không có bất kỳ đầu vào tệp đã xác định nào, Gradle có thể bỏ qua tác vụ, ngay cả khi sử dụng mã trên. Ví dụ, trong tác vụ Zip hoặc Copy cần có ít nhất một tệp được cung cấp trong giai đoạn cấu hình của định nghĩa tác vụ.
tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Bạn có thể dùng cleanTaskname
Giả sử bạn có
:someproject:sometask1 UP-TO-DATE
:someproject:sometask2 UP-TO-DATE
:someproject:sometask3 UP-TO-DATE
Và bạn muốn buộc giả sử sometask2 chạy lại, bạn có thể
someproject:cleanSometask2
trước khi bạn chạy tác vụ chạy tất cả.
Rõ ràng trong gradle, mọi nhiệm vụ hiểu UP-TO-DATE cũng hiểu cách tự làm sạch.
Tôi đã gặp một trường hợp khó khăn trong đó việc đặt outputs.upToDateWhen { false }
bên trong nhiệm vụ hoặc thêm cờ --rerun-tasks
không giúp ích được gì vì nhiệm vụ setOnlyIf
vẫn được đặt thành false
mỗi khi tôi chạy nó.
Thêm phần sau để build.gradle
buộc thực hiện 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 }
}
}
}