watchman-make
旨在与工具一起使用,这些工具将执行他们自己的后续查询,以发现他们下一步想要做什么。例如,运行该make
工具将使stat
各个部门的 make 更新。
这意味着upload.py
如果您想将它与 watchman 一起使用,您的脚本需要知道如何为自己执行此操作。
您有几个选择,具体取决于您希望事情变得多么复杂:
使用 pywatchman 发出临时查询
如果您希望能够upload.py
随时随地运行并让它找出正确的事情(就像make
会做的那样),那么您可以让它直接询问守望者。您可以upload.py
使用pywatchman
(python watchman 客户端)来执行此操作。 pywatchman
如果 watchmanconfigure
脚本认为你有一个工作的 python 安装,将被安装。你也可以pip install pywatchman
。一旦你有它可用并在你的PYTHONPATH
:
import pywatchman
client = pywatchman.client()
client.query('watch-project', os.getcwd())
result = client.query('query', os.getcwd(), {
"since": "n:pi_upload",
"fields": ["name"]})
print(result["files"])
此代码段使用带有命名游标的since 生成器来发现自上次使用相同命名游标发出查询以来发生更改的文件列表。Watchman 会为您记住相关的时钟值,因此您无需通过状态跟踪使脚本复杂化。我们使用光标的名称;该名称在可能使用命名游标的守望者客户端中必须是唯一的,因此在您的工具之后命名它是避免潜在冲突的好主意。pi_upload
这可能是提取所需信息的最直接方法,无需您对上传脚本进行更具侵入性的更改。
使用 pywatchman 启动长时间运行的订阅
这种方法将转换您的upload.py
脚本,使其知道如何直接订阅守望者,因此watchman-make
您无需直接运行upload.py
,而是继续运行并执行上传。这有点侵入性,并且代码太多,无法尝试粘贴到此处。如果您对这种方法感兴趣,那么我建议您将后面的代码watchman-wait
作为起点。你可以在这里找到它:
https://github.com/facebook/watchman/blob/master/python/bin/watchman-wait
您可能想要修改的关键部分是这一行:
https://github.com/facebook/watchman/blob/master/python/bin/watchman-wait#L169
这是它接收文件列表的地方。
为什么不触发?
您可以为此使用触发器,但我们正在引导人们远离触发器,因为它们难以管理。触发器将在后台运行,并将其输出发送到 watchman 日志文件。很难判断它是在运行还是停止运行。
该界面更接近 unix 模型,并允许您在标准输入上提供文件列表。
说到unix,那watchman-wait
呢?
我们还有一个命令可以在更改文件时发出更改文件的列表。watchman-wait
您可能会从upload.py
. 这将使它与订阅方法有一些相似之处,但无需直接使用 pywatchman 客户端。