BazelCon 2022 は、11 月 16 ~ 17 日にニューヨークとオンラインで開催されます。
今すぐご登録ください。

拡張機能の概要

コレクションでコンテンツを整理 必要に応じて、コンテンツの保存と分類を行います。

このページでは、マクロとルールを使用して BUILD 言語を拡張する方法について説明します。

Bazel 拡張子は .bzl で終わるファイルです。拡張機能からシンボルをインポートするには、load ステートメントを使用します。

高度な概念を学ぶ前に、

  • BUILD ファイルと .bzl ファイルの両方で使用されている Starlark 言語についてお読みください。

  • 2 つの BUILD ファイル間で変数を共有する方法を学習する。

マクロとルール

マクロは、ルールをインスタンス化する関数です。BUILD ファイルは、繰り返しが増えすぎたり複雑すぎたりすると、一部のコードを再利用できるため便利です。この関数は、BUILD ファイルが読み取られるとすぐに評価されます。BUILD ファイルの評価後、Bazel にマクロに関する情報はほとんど提供されません。マクロで genrule が生成された場合、Bazel は genrule を作成したかのように動作します。その結果、bazel query には生成された genrule のみが一覧表示されます。

ルールはマクロよりも強力です。Bazel の内部機能を利用し、何が起きているかを完全に制御できます。たとえば、他のルールに情報を渡します。

シンプルなロジックを再利用する場合は、マクロから始めます。マクロが複雑になった場合は、ルール化することをおすすめします。通常、新しい言語のサポートはルールに基づいて行われます。ルールは上級ユーザー向けであるため、ほとんどのユーザーはルールを記述する必要はありません。既存のルールのみが読み込まれ、呼び出されます。

評価モデル

ビルドは 3 つのフェーズで構成されます。

  • 読み込みフェーズ。まず、ビルドに必要なすべての拡張機能とすべての BUILD ファイルを読み込んで評価します。BUILD ファイルが実行されると、ルールをインスタンス化するだけで済みます(ルールが呼び出されるたびにグラフに追加されます)。ここでは、マクロを評価します。

  • 分析フェーズ。ルールのコード(implementation 関数)が実行され、アクションがインスタンス化されます。アクションは、「run gcc on hello.c and get hello.o」などの入力セットから一連の出力を生成する方法について説明します。実際のコマンドを実行する前に、生成されるファイルを明示的にリストする必要があります。つまり、分析フェーズでは、読み込みフェーズで生成されたグラフを取得し、アクション グラフを生成します。

  • 実行フェーズ。アクションは、少なくとも 1 つの出力が必要な場合に実行されます。ファイルがない場合、またはコマンドが 1 つの出力を生成できない場合、ビルドは失敗します。このフェーズではテストも行われます。

Bazel は、並列処理を使用して .bzl ファイルと BUILD ファイルの読み取り、解析、評価を行います。ファイルはビルドごとに最大 1 回読み取られ、評価の結果がキャッシュに保存され、再利用されます。ファイルが評価されるのは、すべての依存関係(load() ステートメント)が解決した後に限られます。設計上、.bzl ファイルを読み込む際に目に見える副作用はありません。値と関数を定義するだけです。

Bazel は工夫が必要です。依存関係分析を使用して、読み込む必要のあるファイル、分析するルール、実行するアクションを特定します。たとえば、現在のビルドに不要なアクションがルールによって生成された場合、そのアクションは実行されません。

拡張機能を作成する

下記の 2 つのリンクは、独自の広告表示オプションを作成する際に役立ちます。常に把握しておくことが重要です。

詳細

マクロルールに加えて、アスペクトリポジトリ ルールを記述します。