如果文件的一部分发生变化,建议运行某些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"
在顶层的不起作用;它每次都会运行。
答案 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
文件以强制重新运行。