3

从守望者捕获文件/路径信息以传递给“make”或其他应用程序的最佳方法是什么?

这就是我想要实现的目标:

当我在开发服务器上保存 .py(s) 文件时,我想检索文件名和路径,将 py 编译为 pyc,然后将 pyc 文件传输到登台服务器。

我应该使用 watchman-make、'heredoc' 方法、ansible 等吗?因为文档非常有用,有没有可用的示例?

而且,pywatchman 的用例是什么?

提前致谢

4

1 回答 1

3

希望这将有助于澄清一些事情:

Watchman 作为每用户服务运行以监控您的文件系统。它可以:

  1. 在文件更改发生时提供实时订阅
  2. 发生文件更改时触发在后台运行的命令
  3. 回答有关自给定时间点以来文件如何更改的查询

pywatchman 是一个 python 客户端实现,它允许您构建使用来自 watchman 的信息的应用程序。watchman-makewatchman-wait工具是使用 pywatchman 实现的。

watchman-make是一种工具,可帮助您make在文件更改时调用(或类似程序)。在您要运行的程序不需要刚刚更改的文件的特定列表的情况下,这是最合适的。 make属于这一类;make将分析您的依赖关系,Makefile然后仅构建已更改的部分。您也可以执行 python distutils 或 setuptoolssetup.py脚本。

原生 watchman 触发器比 更难使用watchman-make,因为它们由 watchman 服务在后台生成,并通过更改文件列表传递。这些最适合完全无人值守的过程,您不需要查看输出并且需要更改文件的精确列表。

根据您的描述,听起来最简单的解决方案是执行编译步骤然后执行同步的脚本,类似于以下内容;让我们称之为build-and-sync.sh

#!/bin/sh
python -m compileall .
rsync -avz . host:/path/

(如果您真的不需要.pyc文件而只需要同步,那么您可以简单地python从上面的脚本中删除该行并让它运行rsync

然后,您可以watchman-make在事情发生变化时使用它来执行此操作:

watchman-make --make='build-and-sync.sh' -p '**/*.py' -t dummy

然后,在更改任何.py文件(或.py文件集)后,watchman-make将执行build-and-sync.sh dummy. 这应该就足够了,除非您有足够多的 python 文件,以至于每次进行更改时编译步骤都需要很长时间。 watchman-make将继续运行,直到您按 CTRL-C 或以其他方式终止该进程;它在终端窗口的前台运行,除非您使用类似的东西nohuptmux或者screen让它保持更长时间。

如果是这种情况,那么您可以尝试使用makewith 模式规则来仅编译更改的 python 文件,或者如果使用 make 表达起来很尴尬,那么也许值得使用pywatchman建立订阅并编译更改的文件。这是一个更高级的用例,我建议查看watchman-wait的代码,看看如何实现。除非您有大量文件或同步时间非常紧迫,否则可能不值得为此付出额外的努力。

我建议先尝试最简单的解决方案,看看它是否满足您的需求,然后再尝试更复杂的选项之一。

使用本机触发器

作为替代方案,您可以使用触发器。它们在后台运行,其输出将发送到 watchman 日志文件。它们比使用更难使用watchman-make

您需要编写一个小程序,通常是脚本,从触发器接收更改文件的列表;最好的方法是通过脚本的标准输入。您可以接收每行一个文件的列表或具有更多结构化信息的 JSON 对象。我们称之为脚本trigger-build-and-sync;由您来实现脚本的内容。假设您只想要标准输入上的文件列表。

该命令将设置触发器;你调用它一次,它会一直持续到手表被移除:

watchman -j <<-EOT
["trigger", "/path/to/root", {
   "name": "build-and-sync",
   "expression": ["suffix", "py"],
   "command": "/path/to/trigger-build-and-sync",
   "append_files": false,
   "stdin": "NAME_PER_LINE"
}]
EOT

完整的文档可以在https://facebook.github.io/watchman/docs/cmd/trigger.html#extended-syntax找到

于 2015-11-29T05:40:15.050 回答