3

我想用shake下载一堆网页,然后对它们做一些处理。但是,我还希望选择在shake 之外下载页面,告诉shake 我已经完成了,然后让shake 继续进行其余的处理步骤。现在我正在做第二步,“告诉震动我已经为它做了一些工作”。

举个简单的例子,这里有一个很短的摇动脚本:

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.

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

% 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

这给我留下了几个问题:

  • 最重要的是:我怎么能要求抖动只是为了更新它的数据库条目test.txt而不运行Action关联的test.txt
  • 有什么作用--touch,为什么没有帮助?
  • 做什么-o/-W做什么,他们为什么不帮忙?
  • 旧/新和干净/脏之间的关系是什么?
4

1 回答 1

2

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

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

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

于 2016-09-25T21:06:30.663 回答