ラベル

問題を報告 ソースを表示 Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

ラベルの最初の部分はリポジトリ名 @@myrepo です。二重の @ 構文は、これが正規リポジトリであることを示します name という ID の ID で、 できます。正規リポジトリ名を持つラベルは、どのコンテキストで表示されても、ターゲットを明確に識別します。

多くの場合、正規リポジトリ名は @@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 などの文字列は、 使用されるコンテキスト。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 ファイルで指定することが推奨されるためです。 パッケージ名が絶対であり、トップレベルがルートであることを伝える ディレクトリに移動します。

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

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

ファイル名は、通常の形式の相対パス名にする必要があります。つまり、 先頭も末尾もスラッシュではない(たとえば、/foofoo/ は 禁止)、またはパス区切り文字として複数の連続スラッシュを含めないでください。 (例: foo//bar)。同様に、上位レベルの参照(..)と 現在のディレクトリの参照(./)は禁止されています。

不適切 - 他のパッケージ内のファイルを参照するために「..」を使用しないでください。

正解 - 「//package-name:filename」を使用

ファイル ターゲットの名前に / を使用するのが一般的ですが、 ルール名に /。特にラベルの短縮形が 読み手を混乱させる可能性があります。//foo/bar/wiz ラベルは常に省略形です。 //foo/bar/wiz:wiz(該当するパッケージ foo/bar/wiz がない場合でも適用) ターゲットが存在しても、//foo:bar/wiz を参照しません。

ただし、スラッシュを使用すると便利な場合や、 場合によっては必要であることさえありますたとえば、特定のルールの名前は、パッケージのサブディレクトリにある主ソースファイルと一致する必要があります。

パッケージ名 - //package-name:target-name

パッケージの名前は、BUILD ファイルを含むディレクトリの名前です。 格納されているリポジトリの最上位ディレクトリからの相対パスです。 例: my/app

パッケージ名は、セットから抽出した文字で完全に構成する必要があります A-Zaz09、「/」、「-」、「.」、「@」、「_」、および次のことはできません スラッシュで始めます。

モジュールにとって重要なディレクトリ構造を持つ言語の場合 ディレクトリ名を指定することが重要です。 言語に含まれる有効な識別子です。

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

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

ルール

ルールは、入力と出力の関係を指定します。 出力を構築します。ルールにはさまざまなタイプがあり、 (ルールクラスと呼ばれることもあります)。これは、コンパイルされた 実行可能なファイルとライブラリ、テスト実行可能なファイル、その他サポートされている (Build 百科事典で説明されている出力)。

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

以下の例では、ターゲット my_app の宣言が示されています。 cc_binary ルールを使用します。

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

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

すべてのルールには、一連の属性があります。特定のエンティティに適用可能な属性を 各属性の重要性とセマンティクスは、 ルールの種類を指定します。Build の百科事典を ルールとそれに対応する属性のリスト。各属性には名前と属性があり、 です。属性の一般的な型には、整数、ラベル、リストなどがあります。 ラベル、文字列、文字列のリスト、出力ラベル、出力ラベルのリスト。× すべての属性をすべてのルールで指定する必要があります。このように属性によって、 キー(名前)からオプションの型付き値までです。

多くのルールに存在する srcs 属性のタイプは「ラベルのリスト」です。 value: ラベルのリスト(存在する場合)です。各ラベルは、 このルールへの入力。

ルールの種類の名前は任意の場合があり、ルールによって生成されるファイルの名前の方が重要です。これは genrules の場合も同様です。詳細については、次をご覧ください: 一般ルール: genrule

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

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

目標 BUILD ファイル