2014-09-29 5 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" 

을하지만이 다시 실행을 못하고, 그래서 a.out이 같은 반복 된 실행을 유지 generated에 대한 규칙 결과 : 여기에 내가 뭘하려합니다.

답변

1

문제를 해결하려면 generated 규칙이 항상 실행되도록 generated의 정의에 alwaysRerun을 추가해야합니다. 정확하게 generatedneed (그리고 뒤에서 need이있는 readFile')에 따라 달라 지므로 generated에는 입력 종속성이 없으므로 다시 실행되지 않습니다. alwaysRerun을 추가하면 항상 변경되는 종속성이 generated이됩니다. 내가보고 기대 :

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

은 (또한 generated 아래까지 s의 정의를 이동할 수 있습니다,하지만 난 당신이 당신의 테스트 케이스를 단순화 한 방법에 불과 인공물의 의심이있다.)

+0

예, 실제로''* .out "'규칙의'writeFile'' 구현과''generated''의 생성 모두는 더 복잡한 작업을 서술하는 스텁입니다. – Cactus

관련 문제