我正在研究一个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
?
答案 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 有更多关于调用的背景知识。