2014-09-29 66 views
1

规则生成的文件为need的正确方法是什么?下面是我的尝试:取决于生成的文件

import Development.Shake 
import System.IO 
import Control.Monad 

main = do 
    s <- withBinaryFile "/dev/urandom" ReadMode $ replicateM 10 . hGetChar 

    shakeArgs shakeOptions $ do 
     want ["a.out"] 

     "generated" *> \target -> writeFileChanged target s 

     "*.out" *> \out -> do 
      need ["generated"] 
      writeFile' out =<< readFile' "generated" 

但是,这导致规则generated没有得到重新运行,所以a.out保持不变,经过反复运行。

回答

1

要解决您的问题,您需要将alwaysRerun添加到generated的定义中,以便generated规则始终运行。您正确地根据generatedneed(还有readFile',它在场景后执行need)正确取决于generated没有任何输入依赖关系,因此永远不会重新运行。添加alwaysRerun会给generated一个始终更改的依赖关系。我希望看到:

"generated" *> \target -> do 
    alwaysRerun 
    writeFileChanged target s 

(您也可以移动的s定义到下generated,但我怀疑这只是你如何简化您的测试案例的假象。)

+0

的确,“* .out”规则的'writeFile''和''generated''的生成都是存在于更多涉及操作中的存根。 – Cactus 2014-09-30 02:29:46