2015-05-05 2 views
1

У меня есть функция, которая перестраивает цели, когда соответствующие команды изменения:Сохранение метаданных для правил

target :: FilePath -> [FilePath] -> String -> Rules() 
target dst deps cline = do 
    let dcmd = dst <.> "x" 
    dcmd %> \out -> do 
    alwaysRerun 
    writeFileChanged out cline 
    return() 
    dst %> \out -> do 
    c <- readFile' dcmd 
    need deps 
    () <- cmd $ "../dumpdeps/dumpdeps " ++ out ++ " " ++ c 
    needMakefileDependencies $ out <.> "d" 
    return() 

Я бы предпочел не трогать файловую систему для решения этой задачи, есть ли способ, чтобы сохранить соответствующую командную строку и вызвать окончательное правило, когда эта команда изменится?

ответ

1

Я лично сделал это, используя файловую систему. Файловые системы имеют отличные отладчики (ls и cat) и большой набор инструментов для манипуляции (echo, rm, touch). Они также имеют тенденцию быть очень быстрыми для небольших файлов, живущих в основном в кеше. Если вы избегаете файлов, вы, как правило, меньше видите, что происходит.

Это может быть очень веские причины, чтобы избежать файлов. Самое близкое, что Shake имеет к вашему шаблону выше, это использовать Oracle. Обратите внимание, что это не совсем соответствует шаблону, который вы делаете, поскольку он предполагает, что cline может быть рассчитан с dst, что может быть возможно в вашем случае или может не быть.

Если Oracle вас не устраивает, вы можете определить свой собственный Rule instance, который может работать так же, как файл, но вместо этого сохраните значения в базе данных Shake.

(Если любой из них вызывает какие-либо затруднения, сообщите мне, что является релевантным для вашего вопроса, и я разберу его справа.)

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