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