3

ウォッチマンから「make」または別のアプリに渡すファイル/パス情報をキャプチャする最良の方法は何ですか?

これが私が達成しようとしているものです:

開発サーバーに .py(s) ファイルを保存するときに、ファイル名とパスを取得し、py を pyc にコンパイルしてから、pyc ファイルをステージング サーバーに転送したいと考えています。

watchman-make、「heredoc」メソッド、ansible などを使用する必要がありますか? ドキュメントは非常に役立つことに注意してください。利用可能な例はありますか?

そして、pywatchman のユースケースは何ですか?

前もって感謝します

4

1 に答える 1

3

うまくいけば、これはいくつかのことを明確にするのに役立ちます:

Watchman は、ユーザーごとのサービスとして実行され、ファイル システムを監視します。できる:

  1. ファイルの変更が発生したときにライブ サブスクリプションを提供する
  2. ファイルの変更が発生したときにバックグラウンドで実行されるコマンドをトリガーする
  3. 特定の時点以降にファイルがどのように変更されたかについてのクエリに回答する

pywatchman は、watchman からの情報を使用するアプリケーションを構築できるようにする Python クライアント実装です。watchman-makeおよびツールは、watchman-waitpywatchman を使用して実装されます。

watchman-makemakeファイルが変更されたときに(または同様のプログラムを)呼び出すのに役立つツールです。実行したいプログラムが、変更されたばかりのファイルの特定のリストを必要としない場合に最も適しています。 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-makeCTRL-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にあります。

于 2015-11-29T05:40:15.050 に答える