我有一个函数可以在关联命令发生变化时重建目标:
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 ()
我不想触摸此任务的文件系统,有没有办法存储相关的命令行并在该命令发生变化时触发最终规则?
答案 0 :(得分:1)
我个人使用文件系统来做这件事。文件系统具有出色的调试器(ls
和cat
)以及大量操作工具(echo
,rm
,touch
)。它们对于小文件来说也非常快,主要生活在缓存中。如果你避开这些文件,你往往对发生的事情的了解程度较低。
也就是说,避免文件可能有很好的理由。 Shake对你的模式最接近的是使用Oracle。请注意,它与您正在执行的模式完全匹配,因为它假定cline
可以从dst
计算,这可能在您的情况下可能或可能不会。
如果Oracle不适合您,您可以定义自己的Rule instance,它可以像文件一样操作,但是将值存储在Shake数据库中。
(如果其中任何一个造成任何困难,请告诉我哪个与您的问题相关,并且我会扩展正确的问题。)