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

問題を報告 ソースを表示

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

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 を実行すると、クライアントはまずサーバーが適切なバージョンであることを確認します。そうでない場合、サーバーは停止して新しいサーバーが起動します。これにより、長時間実行されるサーバー プロセスを使用しても、適切なバージョニングが妨げられることがなくなります。