watchman:不要在触发器

时间:2015-09-16 09:17:26

标签: makefile watchman

我正在研究一个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中的任何内容都不对应,所以我在守望者日志文件中有错误。

如何在触发的命令中不考虑匹配的文件?是否只能使用CLI选项,而不是使用watchman -j

1 个答案:

答案 0 :(得分:0)

抱歉,这些文档并不是很清楚。您需要做的是使用扩展触发器语法来注册触发器。您必须使用-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 有更多关于调用的背景知识。