このページでは、マクロとルールを使用して 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 つのリンクは、独自の拡張機能を作成する際に役立ちます。手が届く範囲に置いてください。
詳しく見る
マクロとルールに加えて、アスペクトとリポジトリ ルールも記述できます。
コードのフォーマットと lint チェックに Buildifier を一貫して使用します。
.bzl
スタイルガイドに沿って設定します。コードをテストします。
ユーザーをサポートするドキュメントを生成する。
コードのパフォーマンスを最適化します。
他のユーザーに拡張機能を導入します。