2014-09-29 3 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 всегда работает. Вы правильно в зависимости от generated с need (а также с readFile', который делает need за сценой), просто generated не имеет каких-либо зависимостей ввода, поэтому никогда не будет повторно запущен. Добавление alwaysRerun дает generated зависимость, которая всегда изменяется. Я бы ожидал увидеть:

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

(Вы можете также переместить определение s вниз под generated, но у меня есть подозрение, что это всего лишь артефакт того, как вы упростили свой тестовый пример.)

+0

Да, действительно, и реализация '' writeFile' '' '.out '' и генерация '' сгенерированных '' являются заглушками, стоящими для более вовлеченных операций. – Cactus

Смежные вопросы