规则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
在重复运行后保持不变。
答案 0 :(得分:1)
要解决您的问题,您需要将alwaysRerun
添加到generated
的定义中,以便始终运行generated
规则。您使用generated
正确依赖need
(以及readFile'
,后面会有need
场景),只是generated
没有' t有任何输入依赖,所以永远不会重新运行。添加alwaysRerun
会为generated
提供始终更改的依赖项。我希望看到:
"generated" *> \target -> do
alwaysRerun
writeFileChanged target s
(您也可以将s
的定义降低到generated
以下,但我怀疑这只是您如何简化测试用例的假象。)