Скидання властивості UP-TO-DATE задач gradle?


106

Чи є спосіб я змусити завдання Gradle запуститись знову або повернути всі завдання назад до стану, НЕ ДО ДАТИ?

Відповіді:


133

Спробуйте запустити свою збірку за допомогою -C rebuildцього відновлення кешу Gradle.

У новіших версіях Gradle використовуйте --rerun-tasks


89

Якщо ви хочете завжди виконувати лише одне завдання, ви можете встановити outputsвластивість всередині завдання.

outputs.upToDateWhen { false }

Майте на увазі, що якщо у вашій задачі немає визначених файлових входів, Gradle може пропустити завдання навіть при використанні вищевказаного коду. Наприклад, у Zip або Copy завдання має бути принаймні один файл, наданий у фазі конфігурації визначення завдання.


14
Це для мене нічого не робить. Я додав його до завдання і отримаю "ДО ДАТИ". Найсмішніше, що це ZipTask, і я видалив архів призначення.
maaartinus

5
Це неймовірно для такого використання:tasks.whenTaskAdded { theTask -> if (theTask.name.startsWith("dex")) { theTask.outputs.upToDateWhen { false } theTask.doLast { task ->... }}}
Мартін Л.

Оновлена ​​відповідь на випадок, коли завдання не буде виконуватися.
cmcginty

Будьте уважні, що в даний час, коли кеш побудований gradle ввімкнено, це не призведе до запуску завдання, але його вихід буде просто відновлений з кешу.
Стівен Фрідріх

25

Можна використовувати cleanTaskname

Скажімо, у вас є

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

І ви хочете змусити, скажімо, sometask2 запустити знову ви можете

someproject:cleanSometask2

перед тим, як запустити завдання, яке виконує все це.

Мабуть, в градусі, кожне завдання, яке розуміє НАДНІСТЬ, також розуміє, як почистити себе.


1
'gradle clean' очистить усе для проекту, в якому ви перебуваєте. Це в основному видаляє вашу основну папку виводу, яка за замовчуванням є "/ build". Це те, що ви шукали?
c_maker

6
Ні. Це не буде відновлено оновлення, якщо оновлення було зроблено як відсутні вихідні файли для даної задачі. Тобто, якщо у мене була якась частина розриву збірки, але в цілому вдалося, захоплений стан помиляється, і мені потрібно це очистити.
Стефан Кендалл

1
Зазвичай завдання "чистого", яке видаляє що-небудь в $ buildDir, доступне в сценаріях збирання, оскільки це вводиться базовим плагіном.
Рене Гроешке

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 }
    }
  }
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.