すべてのターゲットは 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 つがあります(1 つが間違っている、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
属性のタイプは「ラベルのリスト」です。その値はラベルのリストです。ラベルのリストは、それぞれがこのルールに入力されるターゲットの名前です。
ルールの種類の名前はやや任意であり、ルールによって生成されたファイルの名前がより興味深い場合もあります。これは genrules に当てはまります。詳細については、一般ルール: genrule をご覧ください。
他のケースでは、名前が重要です。たとえば、*_binary
ルールと *_test
ルールの場合、ルール名によって、ビルドによって生成された実行可能ファイルの名前が決まります。
ターゲットに対する有向非巡回グラフは、ターゲット グラフまたはビルド依存関係グラフと呼ばれ、Bazel クエリツールが動作するドメインです。
ターゲット | BUILD ファイル |