ラベル

7.3 · 7.2 · 7.1 · 7.0 · 6.5

すべてのターゲットは 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 を使用してパッケージを参照することをおすすめします。

相対ラベルを使用して他のパッケージ内のターゲットを参照することはできません。この場合は、リポジトリ識別子とパッケージ名を常に指定する必要があります。たとえば、ソースツリーにパッケージ 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 ファイルを含むディレクトリを基準としたパス名です。

ターゲット名は、azAZ09 の文字セットと句読点記号 !%-@^_"#$&'()*-+,;<=>?[]{|}~/. で完全に構成する必要があります。

ファイル名は、通常形式の相対パス名にする必要があります。つまり、先頭または末尾にスラッシュを付けることはできません(例: /foofoo/ は禁止されています)。また、パス区切り文字として連続する複数のスラッシュを含めることもできません(例: 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

パッケージ名は、AZaz09/-.@_ のセットから取得した文字で完全に構成する必要があります。先頭をスラッシュにすることはできません。

モジュール システムにとって重要なディレクトリ構造を持つ言語(Java など)の場合、その言語の有効な識別子であるディレクトリ名を選択することが重要です。

Bazel はワークスペースのルート パッケージ(//:foo など)内のターゲットをサポートしていますが、意味のあるすべてのパッケージにわかりやすい名前を付けられるように、そのパッケージは空のままにしておくことをお勧めします。

パッケージ名には、サブ文字列 // を含めることはできません。また、スラッシュで終わることもできません。

ルール

ルールでは、入力と出力の関係と、出力をビルドする手順を指定します。ルールにはさまざまな種類(ルールクラス)があり、ビルド百科事典で説明されているように、コンパイルされた実行可能ファイルとライブラリ、テスト実行可能ファイル、その他のサポートされている出力を生成します。

BUILD ファイルは、rules を呼び出すことでターゲットを宣言します。

次の例では、cc_binary ルールを使用してターゲット my_app を宣言しています。

cc_binary(
    name = "my_app",
    srcs = ["my_app.cc"],
    deps = [
        "//absl/base",
        "//absl/strings",
    ],
)

すべてのルール呼び出しには name 属性(有効なターゲット名である必要があります)があり、BUILD ファイルのパッケージ内のターゲットを宣言します。

すべてのルールには一連の属性があります。特定のルールに適用される属性、および各属性の重要性とセマンティクスは、ルールの種類の関数です。ルールとそれに対応する属性のリストについては、Build Encyclopedia をご覧ください。各属性には名前と型があります。属性に設定できる一般的な型には、整数、ラベル、ラベルのリスト、文字列、文字列のリスト、出力ラベル、出力ラベルのリストなどがあります。すべての属性をすべてのルールで指定する必要はありません。したがって、属性はキー(名前)からオプションの型付き値までの辞書を形成します。

多くのルールに存在する srcs 属性の型は「ラベルのリスト」です。値が存在する場合、それはラベルのリストであり、それぞれがこのルールへの入力となるターゲットの名前です。

ルールの種類の名前はやや任意であり、ルールによって生成されたファイルの名前がより興味深い場合もあります。これは genrules に当てはまります。詳細については、一般ルール: genrule をご覧ください。

他のケースでは、名前が重要です。たとえば、*_binary ルールと *_test ルールでは、ルール名によってビルドによって生成される実行可能ファイルの名前が決まります。

ターゲット上のこの有向非巡回グラフは、ターゲット グラフまたはビルド依存関係グラフと呼ばれ、Bazel クエリツールが動作するドメインです。

ターゲット BUILD ファイル