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

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

4

1 回答 1

2

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

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

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

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

于 2015-05-06T11:23:19.103 回答