首页 > 解决方案 > Gradle:任务中断时运行 finalizedBy (ctrl-c)

问题描述

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

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 论坛上一个古老但尚未回答的问题。

标签: gradle

解决方案


我不相信,在 Gradle 的文档或 API 中我没有看到任何类型的钩子SIGINT或类似的钩子。

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

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

longOperation.dependsOn clean, prepare

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


推荐阅读