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

問題を報告 ソースを表示

Bazel システムは、有効期間の長いサーバー プロセスとして実装されています。これにより、1 つのビルドから次のビルドへの BUILD ファイル、依存関係グラフ、その他のメタデータのキャッシュなど、バッチ指向の実装では不可能な多くの最適化を実行できます。これにより、増分ビルドの速度が向上し、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 を実行すると、クライアントはまずサーバーが適切なバージョンであることを確認します。適切でない場合、サーバーは停止され、新しいサーバーが起動します。これにより、長時間実行されるサーバー プロセスの使用によって適切なバージョニングが妨げられることがなくなります。