すべてのターゲットは 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
という名前のファイルが含まれています。現在地
2 つの方法(1 つが間違っている、もう 1 つ正しい)で、
//my/app:BUILD
:
不適切 - 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:wiz
(該当するパッケージ foo/bar/wiz
がない場合でも適用)
ターゲットが存在しても、//foo:bar/wiz
を参照しません。
ただし、スラッシュを使用すると便利な場合や、 場合によっては必要であることさえありますたとえば、特定のルールの名前は、パッケージのサブディレクトリにある主ソースファイルと一致する必要があります。
パッケージ名 - //package-name:target-name
パッケージの名前は、BUILD
ファイルを含むディレクトリの名前です。
格納されているリポジトリの最上位ディレクトリからの相対パスです。
例: my/app
。
パッケージ名は、A
~Z
、a
~z
、0
~9
、/
、-
、.
、@
、_
のセットから取得した文字で構成する必要があります。また、スラッシュで始めることはできません。
モジュール システムに重要なディレクトリ構造を持つ言語(Java など)では、その言語で有効な識別子であるディレクトリ名を選択することが重要です。
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 Encyclopedia をご覧ください。各属性には名前と型があります。属性に設定できる一般的な型には、整数、ラベル、ラベルのリスト、文字列、文字列のリスト、出力ラベル、出力ラベルのリストなどがあります。× すべての属性をすべてのルールで指定する必要があります。このように属性によって、 キー(名前)からオプションの型付き値までです。
多くのルールに存在する srcs
属性のタイプは「ラベルのリスト」です。
value: ラベルのリスト(存在する場合)です。各ラベルは、
このルールへの入力。
場合によっては、ルールの種類の名前はやや不明確で、 ルールによって生成されたファイルの名前に注目します。これは、 あります。詳細については、次をご覧ください: 一般ルール: genrule
それ以外の場合、*_binary
ルールと *_test
ルールでは名前が重要です。
たとえば、実行可能なファイルの名前が、ルール名によって
表示されます。
ターゲット上のこの有向非巡回グラフは、ターゲット グラフまたはビルド依存関係グラフと呼ばれ、Bazel クエリツールが動作するドメインです。
目標 | BUILD ファイル |