如果文件的一部分发生更改,运行某些操作
的推荐方法是什么?
给我的用例一个我知道存在的文件(具体是 elm-package.json
),运行 shell 命令(elm package install --yes
)如果文件的一部分发生更改(dependency
字段)。
似乎Oracle
抽象公开了将一个值与最后一个值进行比较(通过Eq
)。所以我尝试了 newtype
像:
newtype ElmDependencies = ElmDependencies () deriving ...
type instance RuleResult ElmDependencies = String
但是现在,我实际上在使用 ElmDependency -> Action String
类型的函数时遇到了困难,因为我想编写的规则实际上并不关心返回的 String 是什么,它只是想如果字符串更改,则调用。
换句话说,
action $ do
_ <- askOracle (ElmDependencies ())
cmd_ "elm package install --yes"
在顶层不起作用;它每次都会运行该操作。
最佳答案
您的 askOracle
方法非常接近,但 Shake 需要能够
识别操作的“输出”,因此可以给它一个持久的名称
在运行之间,因此其他步骤可以依赖它,并使用该持久名称来避免重新计算。一种方法是让操作创建一个标记文件,例如:
"packages.stamp" *> \out -> do
_ <- askOracle $ ElmDependencies ()
cmd_ "elm package install --yes"
writeFile' out ""
want ["packages.stamp"]
另外,使用 Oracle
的替代方法是拥有一个文件
您生成的 elm-package-dependency.json
elm-package.json
,使用 writeFileIfChanged
编写(它为您提供文件的 Eq
),并依赖于它
文件位于packages.stamp
中。这样你就可以在文件上获得Eq
,并且还可以
轻松调试它或删除 -dependency.json
文件以强制重新运行。
关于haskell - 如果文件的一部分发生更改则运行操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48915665/