Сбросить свойство UP-TO-DATE задач Gradle?

106

Есть ли способ заставить задачу gradle снова запускаться или сбросить все задачи обратно в состояние НЕ АКТУАЛЬНО ?

Стефан Кендалл
источник

Ответы:

133

Попробуйте запустить свою сборку с -C rebuildвосстановлением кеша Gradle.

В более новых версиях Gradle используйте --rerun-tasks

Рене Грошке
источник
89

Если вы хотите, чтобы всегда выполнялась только одна задача, вы можете установить outputsсвойство внутри задачи.

outputs.upToDateWhen { false }

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

cmcginty
источник
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

перед запуском задачи, которая запускает все это.

По-видимому, в gradle каждая задача, которая понимает АКТУАЛЬНОСТЬ, также понимает, как очистить себя.

c_maker
источник
1
'gradle clean' очистит все для проекта, в котором вы находитесь. Он в основном удаляет вашу основную папку вывода, которая по умолчанию является '/ build'. Это то, что ты искал?
c_maker 03
6
Нет. Это не будет повторно настроено как актуальное, если последнее было зафиксировано как отсутствие выходных файлов для данной задачи. То есть, если у меня была некоторая часть разрыва сборки, но в целом все прошло успешно, захваченное состояние неверно, и мне нужно его очистить.
Стефан Кендалл
1
Обычно «чистая» задача, которая удаляет все в $ 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 }
    }
  }
}
Маттиас Браун
источник