2

Action如果文件的一部分发生更改,推荐的运行方式是什么?

我的用例给出了一个我知道存在的文件(具体而言),如果部分文件更改(字段)elm-package.json,则运行 shell 命令( )。elm package install --yesdependencies

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

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

但是现在,我实际上在使用 type 的这个函数时遇到了困难ElmDependencies -> Action String,因为我要编写的规则实际上并不关心返回的 String 是什么,它只是想在 String 发生变化时被调用。

换句话说,

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

在顶层不起作用;它每次都会运行该动作。

4

1 回答 1

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.jsonwriteFileIfChangedEqpackages.stampEq-dependencies.json

于 2018-02-21T21:19:57.517 回答