在 Gradle 中,如果后续操作被 ctrl-c 中断,是否可以运行 finalizedBy?我认为这意味着将任务绑定(bind)到系统关闭 Hook 。示例项目如下所示:
task prepare << {
println "preparing"
}
task longOperation << {
sleep 50000
}
longOperation.dependsOn prepare
task cleanup << {
println "clean"
}
prepare.finalizedBy cleanup
cleanup.mustRunAfter longOperation
理想情况下,无论“longOperation”的结果如何,我都希望“cleanup”运行,但是用户可能会不耐烦并且 ctrl-c 任务并且整个 gradle JVM 会关闭(可以理解)然后清理不会运行,a la :
$ ./gradlew -b /tmp/blah.gradle longOperation
Parallel execution is an incubating feature.
:prepare
preparing
> Building 33% > :longOperation^C
免责声明:这是来自 Gradle forum 的一个古老但尚未回答的问题.
最佳答案
我不相信,在 Gradle 的文档或 API 中我没有看到任何类型的 Hook SIGINT
或类似的。
这可能是设计选择,因为这是低级别的。您可能需要使用 ProcessBuilder
创建自定义内容。并覆盖/实现 destroy()
Process
的方法.同样,这是低级工作,最好探索 Gradle 提供的替代方案。
一种可能的替代方法是始终调用 clean
之前的任务longOperation
.所以:
longOperation.dependsOn clean, prepare
但我认为更好的解决方案是利用 Worker API某种程度上来说。
关于Gradle:任务中断时运行 finalizedBy (ctrl-c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60152979/