1

我正在研究 Makefile 并尝试使用watchman。这是目前 Makefile 的内容:

compile:
    elm-make app/Main.elm

watch:
    watchman watch `pwd`/app
    watchman trigger -- `pwd` compile 'app/*.elm' -- make compile

这里的问题是当一个被监视的文件被改变时,比如说Other.elm,执行的命令是make compile Other.elm.

make compile是正确的,但make Other.elm与 Makefile 中的任何内容都不对应,因此我在 watchman 日志文件中有错误。

我怎么能不考虑触发命令中的匹配文件?是否只能使用 CLI 选项而不使用watchman -j?

4

1 回答 1

1

对不起,文档不是很清楚。您需要做的是使用扩展触发器语法来注册您的触发器。您必须使用该-j选项才能传递命令的 JSON 表示形式:

watchman -j <<-EOT
["trigger", "`pwd`", {
   "name": "compile",
   "expression": ["match", "elm/*.elm", "wholename"],
   "command": ["make", "compile"],
   "append_files": false
}]
EOT

https://facebook.github.io/watchman/docs/cmd/trigger.html#extended-syntax 有更多关于扩展语法的信息。其中最重要的部分是append_files位。

您需要找到一种在 Makefile 中表达该多行命令的方法;我的直觉只是\在每行末尾使用行继续符,但我没有仔细检查文档。

另请注意,如果您的 shell 是 bash 或 zsh,您可以使用此替代语法将调用放在一行上。我是手动输入的,很可能把引用搞砸了(!):

watchman -j <<< "[\"trigger\", \"`pwd`\", {\"name\": \"compile\", \"expression\":[\"match\", \"elm/*.elm\", \"wholename\"], \"command\": [\"make\", \"compile\"], \"append_files\": false}]"

https://facebook.github.io/watchman/docs/cli-options.html#input-and-output 有更多关于调用的背景。

于 2015-09-17T05:02:26.887 回答