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

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

bazel を実行すると、クライアントが実行されます。クライアントは出力ベースに基づいてサーバーを検索します。出力ベースはデフォルトではベース ワークスペース ディレクトリのパスとユーザー ID によって決まるため、複数のワークスペースでビルドすると、複数の出力ベースが作成され、複数の Bazel サーバー プロセスが実行されます。同じワークステーションの複数のユーザーは、出力ベースが異なる(userid が異なる)ため、同じワークスペースで同時にビルドできます。実行中のサーバー インスタンスが見つからない場合、クライアントは新しいインスタンスを起動します。サーバー プロセスは、一定期間操作がないと停止します(デフォルトでは 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 を実行すると、クライアントはまずサーバーが適切なバージョンであることを確認します。そうでない場合は、サーバーが停止され、新しいサーバーが起動されます。これにより、長時間実行されるサーバー プロセスの使用が適切なバージョン管理を妨げることはありません。