如何跳过摇动动作?
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
这给我留下了几个问题:
- 最重要的是:如果没有 运行
Action
与 test.txt
?
--touch
有什么作用,为什么没有帮助?
-o
/-W
做了什么,他们为什么不帮忙?
- old/new和clean/dirty有什么关系?
存在混合隐喻的观察是正确的,也是问题的一部分。在当前发布的 Shake 版本中,标志取自 Make,它与 Shake 具有不同的语义,因此映射很差。在当前的 Shake HEAD 版本中,它已被重写并且更加简单 - 但现在让我们关注已发布的版本。
在 Shake 0.15(当前发布的版本)中,只有 Shake 之前成功 运行 才能跳过规则。因此,当您 rm
Shake 数据库时,Shake 无法跳过测试执行的规则,因为它以前从未 运行。
在 Shake 0.16 出现之前,一个可靠而简单的选择是向您的构建系统添加一个标志,该标志的存在会跳过所有下载 - 所以 Shake 仍然是 运行 规则,但规则的效果是无操作。
我想用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
这给我留下了几个问题:
- 最重要的是:如果没有 运行
Action
与test.txt
? --touch
有什么作用,为什么没有帮助?-o
/-W
做了什么,他们为什么不帮忙?- old/new和clean/dirty有什么关系?
存在混合隐喻的观察是正确的,也是问题的一部分。在当前发布的 Shake 版本中,标志取自 Make,它与 Shake 具有不同的语义,因此映射很差。在当前的 Shake HEAD 版本中,它已被重写并且更加简单 - 但现在让我们关注已发布的版本。
在 Shake 0.15(当前发布的版本)中,只有 Shake 之前成功 运行 才能跳过规则。因此,当您 rm
Shake 数据库时,Shake 无法跳过测试执行的规则,因为它以前从未 运行。
在 Shake 0.16 出现之前,一个可靠而简单的选择是向您的构建系统添加一个标志,该标志的存在会跳过所有下载 - 所以 Shake 仍然是 运行 规则,但规则的效果是无操作。