从守望者捕获文件/路径信息以传递给“make”或其他应用程序的最佳方法是什么?
这就是我想要实现的目标:
当我在开发服务器上保存 .py(s) 文件时,我想检索文件名和路径,将 py 编译为 pyc,然后将 pyc 文件传输到登台服务器。
我应该使用 watchman-make、'heredoc' 方法、ansible 等吗?因为文档非常有用,有没有可用的示例?
而且,pywatchman 的用例是什么?
提前致谢
从守望者捕获文件/路径信息以传递给“make”或其他应用程序的最佳方法是什么?
这就是我想要实现的目标:
当我在开发服务器上保存 .py(s) 文件时,我想检索文件名和路径,将 py 编译为 pyc,然后将 pyc 文件传输到登台服务器。
我应该使用 watchman-make、'heredoc' 方法、ansible 等吗?因为文档非常有用,有没有可用的示例?
而且,pywatchman 的用例是什么?
提前致谢
希望这将有助于澄清一些事情:
Watchman 作为每用户服务运行以监控您的文件系统。它可以:
pywatchman 是一个 python 客户端实现,它允许您构建使用来自 watchman 的信息的应用程序。watchman-make
和watchman-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 或以其他方式终止该进程;它在终端窗口的前台运行,除非您使用类似的东西nohup
,tmux
或者screen
让它保持更长时间。
如果是这种情况,那么您可以尝试使用make
with 模式规则来仅编译更改的 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找到