В зависимости от сгенерированного файла

Какой правильный путь для правила 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, но у меня есть подозрение, что это всего лишь артефакт того, как вы упростили свой контрольный пример.)

Другие вопросы по тегам