すべてのターゲットは 1 つのパッケージに属します。ターゲットの名前はラベルと呼ばれます。各ラベルによってターゲットが一意に識別されます。正規形式の一般的なラベルは次のようになります。
@myrepo//my/app/main:app_binary
ラベルの最初の部分はリポジトリ名 @myrepo//
です。ラベルが使用するリポジトリと同じリポジトリを指す一般的なケースでは、リポジトリ ID の略称として //
を使用できます。@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 つの方法(不正解、正解)を紹介します。
不適切 - testdata
は別のパッケージであるため、相対パスは使用できません。
testdata/testdepot.zip
正解 - フルパスを使用して testdata
を参照します。
//my/app/testdata:testdepot.zip
@//
で始まるラベルは、メイン リポジトリへの参照で、外部リポジトリからでも機能します。したがって、外部リポジトリから参照される場合、@//a/b/c
は //a/b/c
とは異なります。前者はメイン リポジトリを参照し、後者は外部リポジトリ自体で //a/b/c
を探します。これは、メイン リポジトリ内のターゲットを参照するルールをメイン リポジトリに記述する際に特に関連し、外部リポジトリから使用されます。
ターゲットの参照方法については、ターゲット パターンをご覧ください。
ラベルの字句仕様
ラベル構文では、シェルにとって特別な意味を持つメタ文字の使用は推奨されません。これにより、不注意による引用の問題を回避でき、ラベルを操作するツールやスクリプト(Bazel Query Language など)を簡単に作成できるようになります。
使用できるターゲット名の正確な詳細は次のとおりです。
ターゲット名 - 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
属性(有効なターゲット名である必要があります)があります。
すべてのルールには属性のセットがあります。特定のルールに適用可能な属性と、各属性の意味とセマンティクスは、ルールの種類によって異なります。ルールとそれに対応する属性のリストについては、Build Encyclopedia をご覧ください。各属性には名前とタイプがあります。属性で指定できる一般的な型には、整数、ラベル、ラベルのリスト、文字列、文字列のリスト、出力ラベル、出力ラベルのリストなどがあります。すべてのルールですべての属性を指定する必要はありません。したがって、属性はキー(名前)からオプションの型付き値までの辞書を形成します。
多くのルールに存在する srcs
属性のタイプは「ラベルのリスト」です。その値はラベルのリストです。各ラベルは、このルールの入力となるターゲットの名前になります。
ルールの種類の名前はある程度任意ですが、より興味深いのは、ルールによって生成されたファイルの名前です。これは genrules に当てはまります。詳細については、一般ルール: genrule をご覧ください。
そうでない場合は、名前が重要です。たとえば、*_binary
ルールと *_test
ルールの場合、ルール名によってビルドによって生成された実行可能ファイルの名前が決まります。
このターゲットの有向非巡回グラフは「ターゲット グラフ」または「ビルド依存関係グラフ」と呼ばれ、Bazel クエリツールが動作するドメインです。
ターゲット | BUILD ファイル |