Shake:命令失败后自动删除文件

Shake: automatically deleting file after failed command

使用Shake,制作mp3(这个只是学习例子),我用lame,然后id3v2打标签

如果 lame 成功,但 id3v2 失败,那么我只剩下 mp3 文件了;但当然是"wrong"。我一直在寻找一个选项来在生成命令错误时自动删除目标文件,但我找不到任何东西。我可以通过检查退出代码并使用 removeFiles, or by building in a temporary directory and moving as the last step; but this seems like a common-enough requirement (make does this by default) 手动执行此操作,所以我想知道是否有我没有看到的功能或简单技术。

Make 默认执行此操作的原因是,如果 Make 在磁盘上有部分不完整的文件,它认为任务已成功 运行 并且是最新的,这会破坏一切。相比之下,Shake 会在一个单独的文件 (.shake.database) 中记录任务 运行 成功,因此它知道您的 mp3 文件未完成,并会在下次重建它。

虽然 Shake 不需要您删除文件,但您可能仍希望删除文件以避免混淆用户。您可以使用 actionOnException 来做到这一点,例如:

let generateMp3 = do cmd "lame" ... ; cmd "id3v2" ...
let deleteMp3 = removeFile "foo.mp3"
actionOnException generateMp3 deleteMp3