如何跳过摇动动作?

How do I skip a shake Action?

我想用shake下载一堆网页,然后做一些处理。然而,我也想要在 shake 之外下载页面的选项,告诉 shake 我已经这样做了,然后让 shake 继续执行剩余的处理步骤。现在我正在进行第二步,"tell shake I've done some of its work for it".

举一个最小的例子,这是一个非常短的摇动脚本:

import Development.Shake

main = shakeArgs shakeOptions $ do
    want ["test.txt"]
    "test.txt" %> \_ -> liftIO (putStrLn "yikes!")

我想找到一种方法来防止此脚本打印 yikes!(但仍会更新 test.txt 的数据库条目)。 运行这个和--help,我看到部分:

--touch                     Assume targets are clean.

这听起来很有希望。然而:

% rm -r .shake && ./test --touch
yikes!
Build completed in 0:01m

也许它需要一个明确的文件列表来标记为新文件?

% rm -r .shake && ./test --touch test.txt
yikes!
Build completed in 0:01m

好的。那么,--help 也列出了这个:

-o FILE, --old-file=FILE, --assume-old=FILE
                            Consider FILE to be very old and don't remake it.

我觉得这有点令人费解:我们现在有一个 "clean/dirty" 隐喻和一个 "old/new" 隐喻,但不清楚它们是否相关。此外,如果文件是旧的,那肯定意味着我们 想要重新制作它,对吗?无论如何,它似乎没有做我想做的事:

% rm -r .shake && ./test -o test.txt
yikes!
Build completed in 0:01m

好吧...好吧,也许这个选项与那个选项完全相反,可以满足我的要求:

-W FILE, --what-if=FILE, --new-file=FILE, --assume-new=FILE
                        Consider FILE to be infinitely new.

没有骰子:

% r .shake && ./test -W test.txt
yikes!
Build completed in 0:01m

这给我留下了几个问题:

存在混合隐喻的观察是正确的,也是问题的一部分。在当前发布的 Shake 版本中,标志取自 Make,它与 Shake 具有不同的语义,因此映射很差。在当前的 Shake HEAD 版本中,它已被重写并且更加简单 - 但现在让我们关注已发布的版本。

在 Shake 0.15(当前发布的版本)中,只有 Shake 之前成功 运行 才能跳过规则。因此,当您 rm Shake 数据库时,Shake 无法跳过测试执行的规则,因为它以前从未 运行。

在 Shake 0.16 出现之前,一个可靠而简单的选择是向您的构建系统添加一个标志,该标志的存在会跳过所有下载 - 所以 Shake 仍然是 运行 规则,但规则的效果是无操作。