すべてのターゲットは 1 つのパッケージに属します。ターゲットの名前はラベルと呼ばれます。すべてのラベルはターゲットを一意に識別します。正規形式の一般的なラベルは次のようになります。
@myrepo//my/app/main:app_binary
ラベルの最初の部分はリポジトリ名 @myrepo//
です。ラベルは、それが使用されるのと同じリポジトリを参照する一般的なケースでは、//
のように省略できます。そのため、@myrepo
内では、通常このラベルは次のように記述されます。
//my/app/main:app_binary
ラベルの 2 番目の部分は、修飾されていないパッケージ名 my/app/main
であり、リポジトリのルートからの相対パスです。リポジトリ名と不適格なパッケージ名を合わせたものが、完全修飾パッケージ名 @myrepo//my/app/main
です。ラベルが使われているものと同じパッケージを参照する場合、パッケージ名(とコロン)を省略できます。そのため、@myrepo//my/app/main
内では、このラベルは次のいずれかの方法で記述できます。
app_binary
:app_binary
コロンはファイルの場合は省略されますが、ルールの場合は保持されますが、それ以外は重要ではありません。
ラベルのコロンの後の app_binary
は、修飾されていないターゲット名です。パッケージパスの最後のコンポーネントと一致する場合、そのコロンとコロンは省略できます。これら 2 つのラベルは同等です。
//my/app/lib
//my/app/lib:lib
パッケージのサブディレクトリ内のファイルの名前は、パッケージ ルート(BUILD
ファイルを含むディレクトリ)からの相対パスになります。このファイルは、リポジトリの my/app/main/testdata
サブディレクトリにあります。
//my/app/main:testdata/input.txt
//my/app
や @some_repo//my/app
などの文字列は、使用されるコンテキストに応じて 2 つの意味があります。Bazel によるラベルは、それぞれ //my/app:app
と @some_repo//my/app:app
を意味します。ただし、Bazel は(package_group
仕様などで)パッケージを想定している場合、そのラベルを含むパッケージを参照します。
BUILD
ファイルのよくある間違いは、//my/app
を使用してパッケージを参照するか、パッケージ内のすべてのターゲットに言及しないことです。//my/app:app
と同等であるため、現在のリポジトリの my/app
パッケージ内の app
ターゲットに名前を付けます。
ただし、package_group
または .bzl
ファイルの仕様でパッケージを参照する場合は、//my/app
を使用することが推奨されます。これは、パッケージ名が絶対的で、ワークスペースの最上位ディレクトリにあることをはっきりと通知しているためです。
相対パッケージを使用して他のパッケージのターゲットを参照することはできません。この場合、リポジトリ ID とパッケージ名を指定する必要があります。たとえば、ソースツリーにパッケージ my/app
とパッケージ my/app/testdata
の両方が含まれている場合(これら 2 つのディレクトリはそれぞれ固有の BUILD
ファイルがある場合)、後者のパッケージには testdepot.zip
という名前のファイルが含まれています。//my/app:BUILD
内でこのファイルを参照する方法には、次の 2 つ(いずれか 1 つ、誤りあり)があります。
不適切 - testdata
は別のパッケージであるため、相対パスは使用できません。
testdata/testdepot.zip
正 - testdata
とそのフルパスを参照
//my/app/testdata:testdepot.zip
@//
で始まるラベルはメイン リポジトリへの参照で、外部リポジトリからでも機能します。したがって、外部リポジトリから参照される場合、@//a/b/c
は //a/b/c
とは異なります。前者はメイン リポジトリを指し、後者は外部リポジトリ自体で //a/b/c
を探します。特に、メイン リポジトリでターゲットを参照するルールをメイン リポジトリに書き込む場合に使用すると、外部リポジトリから使用されます。
ターゲットを参照するためのさまざまな方法については、ターゲット パターンをご覧ください。
ラベルの字句仕様
ラベル構文は、シェルに特別な意味を持つメタ文字の使用を推奨しません。これにより、意図しない引用の問題を回避し、Bazel クエリ言語など、ラベルを操作するツールとスクリプトを簡単に作成できます。
使用できるターゲット名の正確な詳細情報は次のとおりです。
ターゲット名 - package-name:target-name
target-name
は、パッケージ内のターゲットの名前です。ルールの名前は、BUILD
ファイル内のルールの宣言の name
属性の値です。ファイル名は、BUILD
ファイルを含むディレクトリへの相対パスになります。
ターゲット名は、セット a
~z
、A
~Z
、0
~9
、句読点記号 !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
から取得した文字のみで構成されている必要があります。
ファイル名は通常のパス名で指定する必要があります。つまり、スラッシュで開始または終了してはならず(たとえば /foo
と foo/
は禁止)、複数のパススラッシュをパス区切り文字として含めることはできません(例: foo//bar
)。同様に、上位の参照(..
)と現在のディレクトリの参照(./
)は禁止されています。
誤 - 他のパッケージ内のファイルを参照するために「..」を使用しないでください。
正 - 「//package-name:filename」を使用します。
ファイル ターゲットの名前に /
を使用するのは一般的ですが、ルールの名前に /
は使用しないでください。特に、ラベルの省略形を使用すると、読者が混乱する可能性があります。ラベル //foo/bar/wiz
は、そのようなパッケージ foo/bar/wiz
がない場合でも、常に //foo/bar/wiz:wiz
の省略形です。ターゲットが存在している場合でも、//foo:bar/wiz
を参照しません。
ただし、スラッシュを使用することが便利な場合もあれば、必要になる場合もあります。たとえば、特定のルールの名前は、パッケージのサブディレクトリにあるプリンシパル ソースファイルと一致する必要があります。
パッケージ名 - //package-name:target-name
パッケージ名は、BUILD
リポジトリを含むディレクトリの名前で、格納されているリポジトリの最上位ディレクトリからの相対パスです。例: my/app
。
パッケージ名は、セット A
~Z
、a
~z
、0
~9
、/
、-
、.
、@
、_
から描画された文字で構成する必要があり、スラッシュで始めることはできません。
モジュール システムにとって重要なディレクトリ構造(Java など)を持つ言語では、その言語で有効な識別子であるディレクトリ名を選択することが重要です。
Bazel はワークスペースのルート パッケージ(//:foo
など)のターゲットをサポートしていますが、すべての意味のあるパッケージにわかりやすい名前を付けるように、そのパッケージを空にすることをおすすめします。
パッケージ名に部分文字列 //
を含めることはできません。また、末尾にスラッシュは使用できません。
ルール
ルールは、入力と出力の関係、および出力を作成するステップを指定します。ルールは、コンパイル済み実行可能ファイル、テスト実行可能ファイル、その他のサポートされている出力を生成し、ビルド百科事典で説明されているような、さまざまな種類(「ルールクラス」と呼ばれることもあります)のいずれかに設定できます。
BUILD
ファイルは、rules を呼び出してターゲットを宣言します。
以下の例では、cc_binary
ルールを使用したターゲット my_app
の宣言を示しています。
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
すべてのルール呼び出しには、BUILD
ファイルのパッケージ内でターゲットを宣言する name
属性(有効なターゲット名)が必要です。
すべてのルールには、一連の属性があります。特定のルールに適用可能な属性や、各属性の意義とセマンティクスは、ルールの種類によるものです。ルールとそれに対応する属性の一覧については、ビルド百科事典をご覧ください。各属性には名前とタイプがあります。属性に指定できる一般的な型としては、整数、ラベル、ラベルのリスト、文字列、文字列のリスト、出力ラベル、出力ラベルのリストなどがあります。すべてのルールにすべての属性を指定する必要はありません。属性は、キー(名前)から型付き(省略可)値までの辞書を形成します。
多くのルールに存在する srcs
属性のタイプは「ラベルのリスト」です。この値は存在する場合、ラベルのリストであり、それぞれがこのルールへの入力であるターゲットの名前です。
場合によっては、ルールの種類の名前が任意であり、より興味深いのはルールによって生成されたファイルの名前です。これは genrule にも当てはまります。詳細については、一般ルール: genrule をご覧ください。
また、名前が重要になることもあります。たとえば、*_binary
ルールと *_test
ルールの場合、ルール名はビルドによって生成される実行可能ファイルの名前を決定します。
この有向非巡回グラフは、ターゲット グラフまたはビルド依存関係グラフと呼ばれ、Bazel クエリツールが動作するドメインです。
ターゲット | ビルドファイル |