すべてのターゲットは 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 などの文字列は、使用されるコンテキストによって意味が異なります。Bazel がラベルを想定している場合、それぞれ //my/app:app と @some_repo//my/app:app を意味します。ただし、Bazel
がパッケージを想定している場合(package_group 仕様など)、その
ラベルを含むパッケージを参照します。
BUILD ファイルでよくある間違いは、//my/app を使用してパッケージを参照すること、または
パッケージ内の すべて のターゲットを参照することです。これはできません。これは
//my/app:appと同じであるため、現在のリポジトリのmy/app
パッケージ内のappターゲットに名前を付けます。
ただし、//my/app を使用してパッケージを参照することをおすすめします。これは、package_group の仕様または .bzl ファイルで、パッケージ名が絶対パスであり、ワークスペースの最上位ディレクトリをルートにしていることを明確に示しているためです。
相対ラベルを使用して他のパッケージのターゲットを参照することはできません。この
場合は、リポジトリ 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 Query Languageなどのラベルを操作するツールやスクリプトを簡単に作成できます。
許可されるターゲット名の正確な詳細は次のとおりです。
ターゲット名 - package-name:target-name
target-name は、パッケージ内のターゲットの名前です。ルールの名前
は、ルール宣言の name 属性の値です。BUILD
ファイルの名前は、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 ファイルは、ルールを呼び出してターゲットを宣言します。
次の例では、ターゲット my_app
を cc_binary ルールを使用して宣言しています。
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
すべてのルール呼び出しには name 属性(有効な
ターゲット名にする必要があります)があり、パッケージ
内のターゲットを宣言します。BUILD
すべてのルールには一連の属性があります。特定の ルールに適用可能な属性と、各属性の重要性とセマンティクスは、 ルールの種類によって異なります。ルールのリストと対応する属性については、ビルド百科事典をご覧ください。各属性には名前と 型があります。属性に設定できる一般的な型には、整数、ラベル、ラベルのリスト 、文字列、文字列のリスト、出力ラベル、出力ラベルのリストなどがあります。すべてのルールですべての属性を指定する必要はありません。したがって、属性は キー(名前)から省略可能な型付きの値へのディクショナリを形成します。
多くのルールに存在する srcs 属性の型は「ラベルのリスト」です。
値が存在する場合、ラベルのリストになります。各ラベルは、このルールへの入力であるターゲットの名前です。
場合によっては、ルールの種類の名前はやや任意であり、ルールによって生成されるファイルの名前の方が 重要です。これは genrule に 当てはまります。詳細については、 一般的なルール: genrule をご覧ください。
名前が重要な場合もあります。たとえば、*_binary ルールと *_test ルールの場合、ルール名によってビルドで生成される実行可能ファイルの名前が決まります。
ターゲットに対するこの有向非巡回グラフは、ターゲットグラフまたは ビルド依存関係グラフと呼ばれ、 Bazel Query ツールが動作するドメインです。
| ターゲット | BUILD ファイル |