Bazel システムは、長時間実行されるサーバー プロセスとして実装されています。これにより、BUILD ファイル、依存関係グラフ、その他のメタデータのキャッシュ保存など、バッチ指向の実装では不可能な多くの最適化を実行できます。これにより、増分ビルドの速度が向上し、build
や query
などの異なるコマンドが、読み込まれたパッケージの同じキャッシュを共有できるため、クエリが非常に高速になります。
bazel
を実行すると、クライアントが実行されます。クライアントは、出力ベースに基づいてサーバーを検索します。デフォルトでは、ベース ワークスペース ディレクトリのパスとユーザー ID によって決まります。複数のワークスペースでビルドする場合は、複数の出力ベースがあり、複数の Bazel サーバー プロセスがあります。出力ベースが異なるため(ユーザー ID が異なる)、同じワークステーション上の複数のユーザーが同じワークスペースで同時にビルドできます。クライアントが実行中のサーバー インスタンスを見つけられない場合は、新しいインスタンスを開始します。サーバプロセスは、一定の時間が経過すると停止します(デフォルトは 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
を実行すると、クライアントはまずサーバーが適切なバージョンであることを確認します。適切でない場合は、サーバーが停止され、新しいサーバーが起動されます。これにより、長時間実行されるサーバー プロセスの使用が適切なバージョニングに干渉することがなくなります。