2016-09-20 47 views
3

我想用摇动下载一堆网页,然后对它们做一些处理。不过,我还想选择下载页面以外的页面,告诉我已经这样做了,然后让其他处理步骤继续进行。现在我正在做第二步,“告诉我为它做了一些工作”。如何跳过摇动操作?

举一个小例子,这里有一个很短的抖动脚本:

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而不运行与test.txt相关的Action
  • --touch做什么,为什么没有帮助?
  • -o/-W做什么,为什么他们没有帮助?
  • 旧/新和干净/脏之间的关系是什么?
+0

另外:我试过寻找[精细手册](http://shakebuild.com/manual#running),但它的命令行标志部分确实很短;它根本没有提到任何这些标志。这是一个教程而不是参考手册。 –

+0

我知道这似乎是一种不合理的做法,但您可能想[使用源代码Luke](https://github.com/ndmitchell/shake)。我认为你的问题是一个很好的问题,但很可能是阅读资料来源是获得答案的最快方法。 – dfeuer

+0

@dfeuer我不认为这是不合理的!我还没有精力去做(还),并且认为我会给一个已经知道答案的人一个机会在我充电时说。 –

回答

2

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

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

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