クライアントとサーバーの実装

問題を報告する ソースを表示 ナイトリー · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Bazel システムは、存続期間の長いサーバー プロセスとして実装されています。これにより、ビルドファイル、依存関係グラフ、その他のメタデータをビルド間でキャッシュに保存するなど、バッチ指向の実装では不可能な多くの最適化を実行できます。これにより、増分ビルドの速度が向上し、buildquery などの異なるコマンドが読み込まれたパッケージの同じキャッシュを共有できるため、クエリが非常に高速になります。各サーバーは一度に最大 1 つの呼び出しを処理できます。それ以上の同時呼び出しは、ブロックまたはフェイル ファスト(--block_for_lock を参照)のいずれかになります。

bazel を実行すると、クライアントが実行されます。クライアントは、出力ベースに基づいてサーバーを検索します。デフォルトでは、ベース ワークスペース ディレクトリのパスとユーザー ID によって決まります。複数のワークスペースでビルドする場合は、複数の出力ベースがあり、複数の Bazel サーバー プロセスがあります。出力ベースが異なるため(ユーザー ID が異なる)、同じワークステーション上の複数のユーザーが同じワークスペースで同時にビルドできます。

実行中のサーバー インスタンスが見つからなければ、クライアントは新しいインスタンスを起動します。これは、出力ベースがすでに存在するかどうかを確認することで行われます。これは、Blaze アーカイブがすでに解凍されていることを意味します。出力ベースが存在しない場合、クライアントはアーカイブのファイルを解凍し、mtime を 9 年後の日付に設定します。インストールが完了すると、クライアントは、解凍したファイルの mtime が遠い日付と等しいことを確認して、インストールの改ざんが行われていないことを確認します。

サーバプロセスは、一定の時間が経過すると停止します(デフォルトでは 3 時間。起動オプション --max_idle_secs を使用して変更可能)。ほとんどの場合、サーバーが実行されているという事実はユーザーには見えませんが、この点に注意する必要があります。たとえば、異なるディレクトリで自動ビルドを多数実行するスクリプトを実行する場合、アイドル状態のサーバーを大量に蓄積しないようにすることが重要です。このためには、処理が完了したら明示的にシャットダウンするか、短いタイムアウト期間を指定します。

Bazel サーバー プロセスの名前は、ps x または ps -e f の出力に bazel(dirname) として表示されます。ここで、dirname はワークスペース ディレクトリのルートを囲むディレクトリのベース名です。例:

ps -e f
16143 ?        Sl     3:00 bazel(src-johndoe2) -server -Djava.library.path=...

これにより、特定のワークスペースに属するサーバー プロセスを簡単に見つけることができます。(ps の他の特定のオプションでは、Bazel サーバー プロセスの名前が java のみになる場合があります)。Bazel サーバーは shutdown コマンドを使用して停止できます。

bazel を実行すると、クライアントはまずサーバーが適切なバージョンであることを確認します。適切でない場合は、サーバーが停止され、新しいサーバーが起動されます。これにより、長時間実行されるサーバー プロセスの使用が適切なバージョニングに干渉することがなくなります。