うまくいけば、これはいくつかのことを明確にするのに役立ちます:
Watchman は、ユーザーごとのサービスとして実行され、ファイル システムを監視します。できる:
- ファイルの変更が発生したときにライブ サブスクリプションを提供する
- ファイルの変更が発生したときにバックグラウンドで実行されるコマンドをトリガーする
- 特定の時点以降にファイルがどのように変更されたかについてのクエリに回答する
pywatchman は、watchman からの情報を使用するアプリケーションを構築できるようにする Python クライアント実装です。watchman-make
およびツールは、watchman-wait
pywatchman を使用して実装されます。
watchman-make
make
ファイルが変更されたときに(または同様のプログラムを)呼び出すのに役立つツールです。実行したいプログラムが、変更されたばかりのファイルの特定のリストを必要としない場合に最も適しています。 make
このカテゴリに属しています。make
の依存関係を分析し、Makefile
変更された部分のみをビルドします。あるいは、python distutils または setuptoolssetup.py
スクリプトを実行することもできます。
watchman-make
ネイティブ ウォッチマン トリガーは、ウォッチマン サービスによってバックグラウンドで生成され、変更されたファイルのリストが渡されるため、よりも使用が少し難しくなります。これらは、出力を表示する必要がなく、変更されたファイルの正確なリストが必要な、完全に無人のプロセスに最も適しています。
あなたが説明したことから、最も簡単な解決策は、コンパイル手順を実行してから同期を実行するスクリプトであると思われます。次のようなものです。呼びましょう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
。
その場合は、変更された python ファイルのみをコンパイルするパターン ルールを使用してみてください。または、make を使用して表現するのが面倒な場合は、サブスクリプションを確立して変更されたファイルをコンパイルするためにmake
使用する価値があるかもしれません。pywatchman
これはより高度な使用例であり、watchman-waitのコードを調べて、それがどのように実現されるかを確認することをお勧めします。多数のファイルがある場合や、同期に非常に厳しい時間的制約がある場合を除き、これに追加の労力をかける価値はないかもしれません。
より複雑なオプションのいずれかを試す前に、最初に最も単純なソリューションを試して、それがニーズを満たすかどうかを確認することをお勧めします。
ネイティブ トリガーの使用
別の方法として、トリガーを使用できます。これらはバックグラウンドで実行され、出力はウォッチマン ログ ファイルに送られます。を使用するよりも操作が少し難しくなりwatchman-make
ます。
トリガーから変更されたファイルのリストを受け取るには、小さなプログラム (通常はスクリプト) を作成する必要があります。これを行う最善の方法は、スクリプトの stdin を使用することです。ファイルのリストを 1 行に 1 つずつ受け取るか、より構造化された情報を含む 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にあります。