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
参数定义了两个目标:all
和 integration
。这些对应于 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
这定义了两个独立的目标,all
和 integration
,每个目标都有一个定义为其触发器的模式列表。每次使用 -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
,但它们不能一起运行