haskell - 如果文件的一部分发生更改则运行操作

标签 haskell shake-build-system

如果文件的一部分发生更改,运行某些操作的推荐方法是什么?

给我的用例一个我知道存在的文件(具体是 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/

相关文章:

haskell - 应用型变压器真的是多余的吗?

haskell - 带 Shake 的多输入、多输出编译器

haskell - 使用 Haskell Stack 时应该使用哪个 -ghc-options?

haskell - 是否可以在haskell : (r -> [a]) -> [r -> a])?中编写函数

unit-testing - 如何测试 Haskell 中的错误?

shake-build-system - 添加系统的操作应该改变规则历史

haskell - SCons 和 Shake 的区别

haskell - 如何使用Shake执行sh命令

haskell - 如何输出/p :Platform ="Any CPU" as quoted from shake cmd?

list - 为什么 Haskell 列表的 `++` 是递归实现的并且花费 O(n) 时间?