このページでは、マクロを使用して BUILD 言語を拡張する方法について説明します。 説明します。
Bazel 拡張機能は、.bzl
で終わるファイルです。拡張機能からシンボルをインポートするには、load ステートメントを使用します。
より高度なコンセプトを学習する前に、まず以下を確認してください。
両方の言語で使用されている Starlark 言語について読む。
BUILD
ファイルと.bzl
ファイル。変数を共有する方法を確認する 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()
)が 1 回だけ評価される
ステートメント)は解決されました。設計により、.bzl
ファイルの読み込み時に
値と関数を定義するだけです。
Bazel は機能性を重視します。依存関係分析を使用して、処理する必要があるファイルを どのルールを分析すべきか、どのアクションを実行すべきかなど、対象 たとえば、ルールによって現在のビルドには必要ないアクションが生成された場合、 実行されません。
広告表示オプションの作成
最初のマクロを作成: いくつかあります。次に、マクロの詳細とマクロを使用して「カスタム動詞」を作成する方法を確認します。
ルールの利用を開始するには、ルールのチュートリアルをご覧ください。 詳しくは、ルールのコンセプトをご覧ください。
独自の拡張機能を作成する際には、以下の 2 つのリンクが非常に役立ちます。手元に置いておく:
さらに先へ
マクロとルールに加えて、ルールを アスペクトとリポジトリ ルール。
Buildifier を常に使用して、コードのフォーマットと lint を行います。
.bzl
スタイルガイドに準拠する。コードをテストします。
ユーザーをサポートするドキュメントを生成します。
コードのパフォーマンスを最適化する。
拡張機能を他のユーザーにデプロイする。