如果文件的一部分发生更改,则运行Action

时间:2018-02-21 21:19:58

标签: haskell shake-build-system

如果文件的一部分发生变化,建议运行某些Action的方法是什么?

我的用例被赋予了一个我知道存在的文件(具体为elm-package.json),如果文件的一部分发生变化(elm package install --yes字段),则运行shell命令(dependencies

似乎Oracle抽象公开了将值与最后一个值(通过Eq)进行比较。所以我尝试了一个newtype

newtype ElmDependencies = ElmDependencies () deriving ...
type instance RuleResult ElmDependencies = String

但是现在,我实际上使用了ElmDependencies -> Action String类型的函数,因为我想写的规则实际上并不关心返回的String是什么,它只是想在String更改时调用它。

换句话说,

action $ do
    _ <- askOracle (ElmDependencies ())
    cmd_ "elm package install --yes"
在顶层的

不起作用;它每次都会运行。

1 个答案:

答案 0 :(得分:2)

你的askOracle方法非常接近,但Shake需要能够 识别动作的“输出”,因此它可以给它一个持久的名称 在运行之间,所以其他步骤可以依赖于它,并使用该持久性名称来避免重新计算。一种方法是使动作创建一个标记文件,例如:

"packages.stamp" *> \out -> do
    _ <- askOracle $ ElmDependencies ()
    cmd_ "elm package install --yes"
    writeFile' out ""
want ["packages.stamp"]

另外,使用Oracle的替代方法是拥有一个文件 您生成的elm-package-dependencies.json elm-package.json,使用writeFileIfChanged(为文件提供Eq)进行编写,并依赖于此 packages.stamp中的文件。这样你就可以在文件上获得Eq,也可以 轻松调试或删除-dependencies.json文件以强制重新运行。