Gradle: запустить finalizedBy, когда задача прервана (ctrl- c) - PullRequest
0 голосов
/ 10 февраля 2020

В Gradle возможно ли запустить finalizedBy, если последующая операция была прервана с помощью ctrl- c? Я думаю, что это будет означать привязку задачи к крюку отключения системы. Пример проекта будет выглядеть примерно так:

task prepare << {
    println "preparing"
}
task longOperation << {
    sleep 50000
}
longOperation.dependsOn prepare
task cleanup << {
    println "clean"
}
prepare.finalizedBy cleanup
cleanup.mustRunAfter longOperation

В идеале я бы хотел, чтобы «очистка» выполнялась независимо от результата «longOperation», но пользователи могут испытывать нетерпение, а ctrl- c задача и вся виртуальная JVM завершает работу (понятно), а затем очистка не запускается, в частности:

$ ./gradlew -b /tmp/blah.gradle longOperation
Parallel execution is an incubating feature.
:prepare
preparing
> Building 33% > :longOperation^C

Отказ от ответственности: Это старый, но без ответа вопрос из форума Gradle .

1 Ответ

1 голос
/ 10 февраля 2020

Я не верю, нигде в документации или API Gradle я не вижу какой-либо ловушки для SIGINT или аналогичной.

Это, вероятно, по выбору, так как это низкий уровень. Вам, вероятно, потребуется создать что-то нестандартное, используя ProcessBuilder и переопределить / реализовать метод destroy() для Process. Опять же, это работа низкого уровня, поэтому может быть лучше изучить альтернативы, которые предлагает Gradle.

Одна из возможных альтернатив - всегда вызывать задачу clean до longOperation. Итак:

longOperation.dependsOn clean, prepare

Но я думаю, что лучшим решением было бы каким-то образом использовать Worker API .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...