このページでは、マクロとルールを使用して BUILD 言語を拡張する方法について説明します。
Bazel 拡張機能は、末尾が .bzl
のファイルです。拡張機能からシンボルをインポートするには、読み込みステートメントを使用します。
より高度なコンセプトについて学習する前に、まず次のことを行います。
BUILD
ファイルと.bzl
ファイルの両方で使用される Starlark 言語について確認します。2 つの
BUILD
ファイル間で変数を共有する方法を学習する。
マクロとルール
マクロはルールをインスタンス化する関数です。これは、一部のコードを再利用できるため、BUILD
ファイルの繰り返しが多くなりすぎたり、複雑すぎたりする場合に便利です。この関数は、BUILD
ファイルが読み取られるとすぐに評価されます。BUILD
ファイルの評価後、Bazel にはマクロに関する情報がほとんどありません。マクロが genrule
を生成すると、Bazel は genrule
を作成したかのように動作します。その結果、bazel query
は生成された genrule
のみを一覧表示します。
ルールはマクロよりも強力です。Bazel の内部にアクセスして、動作を完全に制御できます。たとえば、他のルールに情報を渡すこともできます。
単純なロジックを再利用する場合は、マクロから始めます。マクロが複雑な場合は、ルールにすることをおすすめします。通常、新しい言語のサポートはルールによって行われます。ルールは上級ユーザー向けであり、ほとんどのユーザーはルールを作成する必要はありません。既存のルールを読み込んで呼び出すだけです。
評価モデル
ビルドは 3 つのフェーズで構成されます
読み込みフェーズ。まず、ビルドに必要なすべての拡張機能とすべての
BUILD
ファイルを読み込んで評価します。BUILD
ファイルを実行すると、ルールがインスタンス化されるだけです(ルールが呼び出されるたびに、ルールがグラフに追加されます)。ここでマクロが評価されます。分析フェーズ。ルールのコード(その
implementation
関数)が実行され、アクションがインスタンス化されます。アクションは、「hello.c で gcc を実行して hello.o を取得する」など、入力のセットから一連の出力を生成する方法を記述します。実際のコマンドを実行する前に、生成されるファイルを明示的に指定する必要があります。つまり、分析フェーズでは、読み込みフェーズで生成されたグラフを使用してアクション グラフを生成します。実施フェーズ。アクションは、少なくとも 1 つの出力が必要な場合に実行されます。ファイルがない場合や、コマンドが 1 つの出力を生成できない場合、ビルドは失敗します。このフェーズではテストも実行されます。
Bazel は、並列処理を使用して .bzl
ファイルと BUILD
ファイルの読み取り、解析、評価を行います。ファイルはビルドごとに最大 1 回読み取られ、評価結果はキャッシュに保存され、再利用されます。ファイルは、すべての依存関係(load()
ステートメント)が解決された場合にのみ評価されます。設計上、.bzl
ファイルの読み込みに目に見える副作用はなく、値と関数を定義するだけです。
Bazel は機能性を重視しています。依存関係分析を使用して、読み込む必要があるファイル、分析する必要があるルール、実行する必要があるアクションを判断します。たとえば、現在のビルドに不要なアクションがルールで生成された場合、そのアクションは実行されません。
広告表示オプションを作成する
コードを再利用するには、最初のマクロを作成します。マクロの詳細と、マクロを使用して「カスタム動詞」を作成する方法をご覧ください。
ルールの利用を開始するには、ルールのチュートリアルをご覧ください。 詳しくは、ルールのコンセプトをご覧ください。
以下の 2 つのリンクは、独自の拡張機能を作成する際に役立ちます。常に手の届くところに置いてください。
さらに先へ
マクロとルールに加えて、アスペクトとリポジトリ ルールを作成することもできます。
Buildifier を一貫して使用して、コードのフォーマットと lint チェックを行います。
.bzl
スタイルガイドに準拠する。コードをテストします。
ユーザーに役立つドキュメントを生成します。
コードのパフォーマンスを最適化する。
拡張機能を他のユーザーにデプロイします。