前のセクションでは、パッケージ、ターゲット、ラベル、ビルド依存関係グラフについて抽象的に説明しました。このセクションでは、パッケージの定義に使用される具体的な構文について説明します。
定義上、すべてのパッケージには短いプログラムである BUILD
ファイルが含まれています。
BUILD
ファイルは、命令型言語である Starlark を使用して評価されます。
これらは一連のステートメントとして解釈されます。
一般に、順序は重要です。たとえば、変数は使用する前に定義する必要があります。ただし、ほとんどの BUILD
ファイルはビルドルールの宣言のみで構成されており、これらのステートメントの相対的な順序は重要ではありません。重要なのは、パッケージ評価が完了するまでにどのルールがどのような値で宣言されたかです。
cc_library
などのビルドルール関数が実行されると、グラフに新しいターゲットが作成されます。このターゲットは、後でラベルを使用して参照できます。
単純な BUILD
ファイルでは、動作を変更せずにルール宣言の順序を自由に並べ替えることができます。
コードとデータの明確な分離を促進するため、BUILD
ファイルには関数定義、for
ステートメント、if
ステートメントを含めることはできません(ただし、リスト内包表記と if
式は許可されています)。代わりに、関数を .bzl
ファイルで宣言できます。また、BUILD
ファイルでは *args
引数と **kwargs
引数は許可されません。代わりに、すべての引数を明示的にリストします。
重要な点として、Starlark のプログラムは任意の I/O を実行できません。この不変条件により、BUILD
ファイルの解釈が密閉されます。つまり、既知の入力セットのみに依存します。これは、ビルドの再現性を確保するために不可欠です。詳細については、Hermeticityをご覧ください。
BUILD
ファイルは、基盤となるコードの依存関係が変更されるたびに更新する必要があるため、通常はチームの複数のメンバーによって管理されます。BUILD
ファイルの作成者は、各ビルド ターゲットの役割、一般公開を目的としているかどうか、パッケージ自体の役割を文書化するために、コメントを自由に追加する必要があります。
拡張機能を読み込む
Bazel 拡張機能は、.bzl
で終わるファイルです。load
ステートメントを使用して、拡張機能からシンボルをインポートします。
load("//foo/bar:file.bzl", "some_library")
このコードは、ファイル foo/bar/file.bzl
を読み込み、環境に some_library
記号を追加します。これは、新しいルール、関数、定数(文字列やリストなど)を読み込むために使用できます。load
の呼び出しに追加の引数を使用することで、複数のシンボルをインポートできます。引数は文字列リテラル(変数なし)にする必要があり、load
ステートメントはトップレベルに記述する必要があります。関数本体に記述することはできません。
load
の最初の引数は、.bzl
ファイルを識別するラベルです。相対ラベルの場合、現在の bzl
ファイルを含むパッケージ(ディレクトリではない)に対して解決されます。load
ステートメントの相対ラベルでは、先頭に :
を使用する必要があります。
load
はエイリアスもサポートしているため、インポートされたシンボルに別の名前を割り当てることができます。
load("//foo/bar:file.bzl", library_alias = "some_library")
1 つの load
ステートメント内で複数のエイリアスを定義できます。また、引数リストにはエイリアスと通常のシンボル名の両方を含めることができます。次の例は完全に有効です(引用符を使用するタイミングに注意してください)。
load(":my_rules.bzl", "some_rule", nice_alias = "some_other_rule")
.bzl
ファイルでは、_
で始まるシンボルはエクスポートされず、別のファイルから読み込むこともできません。
読み込みの公開設定を使用すると、.bzl
ファイルを読み込むことができるユーザーを制限できます。
ビルドルールの種類
ビルドルールの大部分はファミリーに属し、言語ごとにグループ化されています。たとえば、cc_binary
、cc_library
、cc_test
は、それぞれ C++ バイナリ、ライブラリ、テストのビルドルールです。他の言語でも同じ命名規則が使用されますが、接頭辞は異なります(Java の場合は java_*
など)。これらの関数の一部は Build Encyclopedia に記載されていますが、誰でも新しいルールを作成できます。
*_binary
ルールは、指定された言語で実行可能プログラムをビルドします。ビルド後、実行可能ファイルはビルドツールのバイナリ出力ツリー内のルールのラベルに対応する名前で保存されます。たとえば、//my:program
は$(BINDIR)/my/program
に表示されます。一部の言語では、このようなルールによって、ルールに属する
data
属性、または依存関係の推移的閉包内の任意のルールで言及されているすべてのファイルを含む runfiles ディレクトリも作成されます。このファイルのセットは、本番環境へのデプロイを容易にするために 1 か所に集められます。*_test
ルールは、自動テストに使用される*_binary
ルールの特殊化です。テストは、成功時に 0 を返すプログラムです。バイナリと同様に、テストにも runfiles ツリーがあり、その下のファイルは、テストが実行時に正当に開くことができる唯一のファイルです。たとえば、プログラム
cc_test(name='x', data=['//foo:bar'])
が実行中に$TEST_SRCDIR/workspace/foo/bar
を開いて読み取る場合があります。(各プログラミング言語には$TEST_SRCDIR
の値にアクセスするための独自のユーティリティ関数がありますが、それらはすべて環境変数を直接使用することと同等です)。このルールを守らないと、リモート テストホストで実行されたときにテストが失敗します。*_library
ルールは、指定されたプログラミング言語で個別にコンパイルされたモジュールを指定します。ライブラリは他のライブラリに依存でき、バイナリとテストはライブラリに依存できます。この場合、コンパイルは別々に行われます。
ラベル | 依存関係 |
ファイル エンコード
BUILD
ファイルと .bzl
ファイルは UTF-8 でエンコードする必要があります。ASCII は有効なサブセットです。現在、任意のバイト シーケンスは許可されていますが、今後サポートされなくなる可能性があります。