Gradle:任务中断时运行 finalBy (ctrl-c)



在 Gradle 中,如果后续操作被 ctrl-c 中断,是否可以运行 finalBy ?我认为这意味着将任务绑定到系统关闭钩子。示例项目如下所示:

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

理想情况下,无论"longOperation"的结果如何,我都希望"清理"运行,但是用户可能会不耐烦并按 ctrl-c 任务,整个 gradle JVM 关闭(可以理解(,然后清理没有运行,啦:

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

免责声明:这是 Gradle 论坛上一个古老但尚未回答的问题。

我不这么认为,在 Gradle 的文档或 API 中,我没有看到任何用于SIGINT或类似内容的钩子。

这可能是设计选择,因为这是低级别。您可能需要使用ProcessBuilder创建自定义内容并覆盖/实现destroy()Process方法。同样,这是低级工作,最好探索 Gradle 提供的替代方案。

一种可能的替代方法是始终在longOperation之前调用clean任务。所以:

longOperation.dependsOn clean, prepare

但我认为更好的解决方案是以某种方式利用 Worker API。

最新更新