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在重复运行后保持不变。

4

1 回答 1

1

要解决您的问题,您需要添加alwaysRerun的定义generated,以便generated规则始终运行。您正确地依赖于generatedneed以及在幕后使用的),只是它readFile'没有任何输入依赖项,因此永远不会重新运行。添加会产生一个总是变化的依赖关系。我希望看到:needgeneratedalwaysRerungenerated

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

(您也可以将sdown 的定义移至 under generated,但我怀疑这只是您如何简化测试用例的人工制品。)

于 2014-09-29T16:18:23.343 回答