2014-09-29 63 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