ラベル

問題を報告 ソースを表示

ラベルはターゲットの識別子です。完全な正規形式の一般的なラベルは次のようになります。

@@myrepo//my/app/main:app_binary

ラベルの最初の部分はリポジトリ名 @@myrepo です。二重の @ 構文は、これが正規のリポジトリ名であり、ワークスペース内で一意であることを意味します。正規リポジトリ名のラベルは、出現するコンテキストに関係なく、明確にターゲットを識別します。

多くの場合、正規リポジトリ名は @@rules_java~7.1.0~toolchains~local_jdk のような不可解な文字列です。よく見られるのは、次のような明らかにリポジトリ名のラベルです。

@myrepo//my/app/main:app_binary

唯一の違いは、リポジトリ名の先頭に 2 つではなく 1 つの @ が付いている点です。これは、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 つの方法(不正解、正解)を紹介します。

不適切 - 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 ファイルを含むディレクトリを基準とする相対パス名になります。

ターゲット名は、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",
    ],
)

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

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

多くのルールに存在する srcs 属性のタイプは「ラベルのリスト」です。その値はラベルのリストです。各ラベルは、このルールの入力となるターゲットの名前になります。

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

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

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

ターゲット BUILD ファイル