存储规则的元数据

Storing metadata for rules

我有一个函数可以在相关命令更改时重建目标:

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 ()

我不想为此任务触及文件系统,有什么方法可以存储关联的命令行并在该命令更改时触发最终规则吗?

我个人会使用文件系统执行此操作。文件系统有很棒的调试器(lscat)和大量的操作工具(echormtouch)。它们对于小文件也往往非常快,主要存在于缓存中。如果您避开这些文件,您往往不太了解正在发生的事情。

也就是说,可以有很好的理由避免这些文件。 Shake 与您上面的模式最接近的是使用 Oracle。请注意,这与您正在执行的模式并不完全匹配,因为它假定 cline 可以从 dst 计算得出,这在您的情况下可能可行,也可能不可行。

如果 Oracle 不适合您,您可以定义自己的 Rule instance,其操作方式与文件大致相同,但将值存储在 Shake 数据库中。

(如果其中任何一个造成任何困难,请告诉我哪个与您的问题相关,我将扩展正确的那个。)