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

問題を報告する ソースを表示

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

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

クライアントが実行中のサーバー インスタンスを検出できない場合は、新しいインスタンスを起動します。これは、出力ベースがすでに存在するかどうかを確認することで、ブレーズ アーカイブがすでに展開されていることを意味します。それ以外の場合、出力ベースが存在しない場合、クライアントはアーカイブのファイルを解凍し、mtime を 9 年後の日付に設定します。インストール後、解凍したファイルの mtime が遠い日付と等しいことを確認し、インストールの改ざんが発生していないことを確認します。

サーバー プロセスは、一定時間操作が行われなくなると停止します(デフォルトでは 3 時間、起動オプション --max_idle_secs を使用して変更できます)。ほとんどの場合、実行中のサーバーはユーザーに表示されないため、この点に留意する必要があります。たとえば、さまざまなディレクトリで多くの自動ビルドを実行するスクリプトを実行している場合は、アイドル状態のサーバーをあまり増やさないようにすることが重要です。この操作は、終了時に明示的にシャットダウンするか、タイムアウト期間を短く指定して行います。

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

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

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

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