跳到主要内容

watchman-make

watchman-make 是一个便捷工具,用于帮助自动调用构建工具或脚本以响应文件更改。在开发过程中,当你保存文件时,它可用于自动构建资源或运行测试。

watchman-make 将对你指定的文件建立监视,并在前台保持运行,等待更改发生。当触发更改时,你的构建工具或脚本将在前台运行,其输出将传递到你的终端会话(或你可能已将其重定向到的任何位置)。

事件在调度到你的构建工具之前会被合并和稳定,以便在文件停止更改后才开始执行。 --settle 参数控制稳定持续时间。

watchman-make 需要 pywatchman (因此需要 python) 以及 watchman

示例

$ watchman-make -p '**/*.c' '**/*.h' 'Makefile*' -t all -p 'tests/**/*.py' 'tests/**/*.c' -t integration
# Relative to /Users/wez/fb/watchman
# Changes to files matching **/*.c **/*.h Makefile* will execute `make all`
# Changes to files matching tests/**/*.py tests/**/*.c will execute `make integration`
# waiting for changes

目标

你可以告知 watchman-make 一个或多个构建目标及其依赖项,然后它将在检测到更改时触发这些目标的构建。

上面的示例使用 -t 参数定义了两个目标:allintegration。这些对应于 watchman Makefile 中具有相同名称的目标。每个目标都会获取由其前面的 -p 参数定义的模式列表。

$ watchman-make -p '**/*.c' '**/*.h' -t all

上面定义了一个名为 all 的目标,只要更改的任何文件组合的文件名与目录树中任何级别的模式 *.c*.h 匹配,就会触发该目标(这就是 ** 部分的含义)。当它触发时,watchman-make 将执行 make all

如果你不使用 make,你可以使用 --make 选项来告诉 watchman-make 使用你选择的构建器。当触发一个目标时,watchman-make 会将 --make 的值与目标名称连接起来,并使用 shell 执行该命令。

目标名称对 watchman-make 没有特殊含义,它仅用于构造要调用的命令。没有特定于 Makefile 或 make 的特殊逻辑或支持。

多个目标

有两种不同的方法来指定多个目标。第一个显示在本页顶部的示例中,并在此处重复。

$ watchman-make -p '*.c' '*.h' 'Makefile*' -t all -p 'tests/**/*.py' 'tests/**/*.c' -t integration

这定义了两个独立的目标,allintegration,每个目标都有一个定义为其触发器的模式列表。每次使用 -t 选项指定目标时,都会清除 -p 选项的值。

如果更改与 .*c 匹配的文件(位于树的顶层),则以上操作将导致运行 make all,如果更改测试目录下的源文件,则将导致运行 make integration

另一种方法是用你的 -t 选项列出多个目标名称

$ watchman-make -p '*.c' '*.h' 'Makefile*' 'tests/**/*.py' 'tests/**/*.c' -t all integration

如果你更改任何顶级 *.c 文件*或*测试源文件,这将执行 make all integration

运行脚本

自 4.8 起。

作为目标的替代方法,你可以提供脚本的路径,当检测到更改时,watchman-make 将执行该脚本。

$ watchman-make -p '**/*.c' '**/*.h' --run my_script.sh

只要更改的任何文件组合的文件名与目录树中任何级别的模式 *.c*.h 匹配,以上操作都将运行提供的脚本。当它触发时,watchman-make 将执行 my_script.sh

你必须使用 --target--run 运行 watchman-make,但它们不能一起运行