取决于生成的文件

时间:2014-09-29 13:20:11

标签: shake-build-system

规则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 个答案:

答案 0 :(得分:1)

要解决您的问题,您需要将alwaysRerun添加到generated的定义中,以便始终运行generated规则。您使用generated正确依赖need(以及readFile',后面会有need场景),只是generated没有' t有任何输入依赖,所以永远不会重新运行。添加alwaysRerun会为generated提供始终更改的依赖项。我希望看到:

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

(您也可以将s的定义降低到generated以下,但我怀疑这只是您如何简化测试用例的假象。)