Đặt lại thuộc tính UP-TO-DATE của nhiệm vụ gradle?


106

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:


133

Cố gắng chạy bản dựng của bạn với -C rebuildbộ 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


89

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 outputstí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ụ.


14
Điều này không làm gì cho tôi. Tôi đã thêm nó vào một công việc và nhận được "UP-TO-DATE". Điều buồn cười là đó là một ZipTask và tôi đã xóa kho lưu trữ đích.
maaartinus

5
Đây là tuyệt vời để sử dụng như thế này:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Martin L.

Cập nhật câu trả lời cho trường hợp khi tác vụ sẽ không chạy.
cmcginty

Hãy lưu ý rằng ngày nay khi bộ đệm ẩn tích hợp gradle được kích hoạt, điều này sẽ không khiến tác vụ chạy lại, nhưng đầu ra của nó sẽ chỉ được khôi phục từ bộ đệm.
Stephen Friedrich

25

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.


1
'gradle clean' sẽ làm sạch mọi thứ cho dự án mà bạn đang tham gia. Về cơ bản, nó xóa thư mục đầu ra chính của bạn là '/ build' theo mặc định. Đây có phải là những gì bạn đang tìm kiếm?
c_maker

6
Không. Điều đó sẽ không được thiết lập lại cập nhật nếu cập nhật được ghi lại dưới dạng không có tệp đầu ra nào cho một nhiệm vụ nhất định. Đó là, nếu tôi có một số phần của quá trình xây dựng nhưng lại thành công về tổng thể, thì trạng thái được chụp là sai và tôi cần phải xóa nó.
Stefan Kendall

1
thông thường tác vụ 'sạch' xóa mọi thứ trong $ buildDir có sẵn trong các tập lệnh xây dựng vì nó được giới thiệu bởi plugin cơ sở.
Rene Groeschke

5

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-taskskhông giúp ích được gì vì nhiệm vụ setOnlyIfvẫn được đặt thành falsemỗi khi tôi chạy nó.

Thêm phần sau để build.gradlebuộ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 }
    }
  }
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.