Подтвердить что ты не робот

"До даты" Gradle статус задачи, когда он не имеет выхода

Как вы можете правильно пометить задачу Gradle как "актуальную", когда задача не производит никакого вывода? Задача должна оставаться "актуальной", если последний прогон был успешным, и с тех пор исходные данные не изменились. Руководство Gradle указывает перед разделом 15.9.2 следующее:

"A task with no defined outputs will never be considered up-to-date."

Как можно отметить задачи как актуальные в этом случае? Похоже, что Gradle должен знать время последнего успешного запуска, а затем сравнивать его с последним измененным временем ввода. В качестве обходного пути script может создать/коснуться пустого файла, чтобы пометить задачу как завершенную? Есть ли другие предлагаемые способы обхода?

4b9b3361

Ответ 1

Просто подумайте о разных сценариях...

  • Задачи без ввода или вывода. Они работают все время. Это может быть просто завершение существующего исполняемого файла "сделать что-то".

  • Задачи со входами и. Они запускаются при изменении входов или выходов. Это может быть компилятор.

  • Задачи с просто выходами. Они запускаются только тогда, когда выходы изменены/не существуют. Это может быть что-то, что что-то загружает. (Я думаю, что они в действительности довольно редки, я бы подсчитал URL-адрес для загрузки в качестве ввода.)

  • Задачи с входами и без выходов. Я не сталкивался с этим на практике.

Как вы уже сказали, вы можете обмануть обновленные проверки с выходным файлом, который просто пуст. Встроенная Gradle Test задача наиболее похожа на то, что вы описываете, и она имеет "отчет" в качестве вывода. Думаю, у вас, вероятно, тоже будет что-то похожее. Это может быть так же просто, как захват stdout/stderr задачи и помещение его в файл. Это не слишком полезно для того, когда все проходит, но было бы полезно, когда все провалится.

Конечно, любой из них может быть дополнен пользовательским кодом upToDateWhen. например, у вас есть задача, которая запускает веб-сервер и "обновляется", когда веб-сервер уже запущен. Я не думаю, что это хорошо вписывается в то, что вы здесь описываете.

Для начала я попробую:

outputs.files file("${buildDir}/reports/${name}.out")

Я думаю, что это будет работать с или без что-то помещать в файл.

Ответ 2

Вы можете переопределить задачи upToDateWhen.

task createDist(type: Zip) {
  outputs.upToDateWhen {
    return true
  }
}

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