gradle - 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 的文档或 API 中我没有看到任何类型的钩子SIGINT
或类似的钩子。
这可能是设计选择,因为这是低级别的。您可能需要使用ProcessBuilder
和覆盖/destroy()
实现Process
. 同样,这是低级工作,最好探索 Gradle 提供的替代方案。
一种可能的替代方法是始终在clean
之前调用任务longOperation
。所以:
longOperation.dependsOn clean, prepare
但我认为更好的解决方案是以某种方式利用Worker API。
推荐阅读
- javascript - Some Time 的 PM 时间值在 momentjs 中以 AM 的形式出现
- javascript - 强制控制器功能等待服务功能
- typescript - 根据同一对象中的键缩小属性的可能值
- apache-beam - pcollection 的侧输入
- reactjs - 从 React Google 地图中移除 Edge?
- azure - Ansible Azure 信用
- ios - AVAssetWriter 元数据日期问题
- java - 如何从服务器获得响应,例如“上传成功”
- mybatis - 为什么mybatis insert 不返回最后一个insert id?
- r - 基于 dplyr 函数从现有数据框创建列表