ワークスペース、パッケージ、ターゲット

Bazel は、ワークスペースと呼ばれるディレクトリ ツリーに整理されたソースコードからソフトウェアをビルドします。ワークスペース内のソースファイルは、パッケージのネストされた階層に整理されます。各パッケージは、関連するソースファイルのセットと 1 つの BUILD ファイルを含むディレクトリです。BUILD ファイルは、ソースからビルドできるソフトウェア出力を指定します。

ワークスペース

ワークスペース は、ビルドするソフトウェアのソースファイルを含むファイル システム上のディレクトリ ツリーです。各ワークスペースには WORKSPACE という名前のテキスト ファイルがあります。このファイルは空の場合もあれば、 出力のビルドに必要な外部依存関係への参照が含まれている場合もあります。

WORKSPACE という名前のファイルを含むディレクトリは、ワークスペースのルートと見なされます。したがって、Bazel は、WORKSPACE ファイルを含むサブディレクトリをルートとするワークスペース内のディレクトリ ツリーを無視します。これは、別のワークスペースを形成するためです。

Bazel は、WORKSPACE ファイルのエイリアスとして WORKSPACE.bazel ファイルもサポートしています。 両方のファイルが存在する場合は、WORKSPACE.bazel が使用されます。

リポジトリ

コードはリポジトリ に整理されます。WORKSPACE ファイルを含むディレクトリは、メイン リポジトリのルートです。これは @ とも呼ばれます。他の(外部)リポジトリは、ワークスペース ルールを使用して WORKSPACE ファイルで定義されます。

Bazel にバンドルされているワークスペース ルールについては、 ビルド百科事典ワークスペース ルールのセクションと、 埋め込み Starlark リポジトリ ルールのドキュメントをご覧ください。

外部リポジトリはリポジトリ自体であるため、WORKSPACE ファイルが含まれていることがよくあります。ただし、これらの追加の WORKSPACE ファイルは Bazel によって無視されます。特に、推移的に依存するリポジトリは自動的に追加されません。

パッケージ

リポジトリ内のコード編成の基本単位はパッケージ です。パッケージは、関連するファイルのコレクションと、出力アーティファクトの生成に使用する方法の仕様です。

パッケージは、BUILD (または BUILD.bazel)という名前のファイルを含むディレクトリとして定義されます。パッケージには、そのディレクトリ内のすべてのファイルと、 その下にあるすべてのサブディレクトリが含まれます。ただし、 BUILD ファイルを含むサブディレクトリは除きます。この定義では、ファイルまたはディレクトリを 2 つの異なるパッケージの一部にすることはできません。

たとえば、次のディレクトリ ツリーには、my/app とサブパッケージ my/app/tests の 2 つのパッケージがあります。my/app/data はパッケージではなく、パッケージ my/app に属するディレクトリです。

src/my/app/BUILD
src/my/app/app.cc
src/my/app/data/input.txt
src/my/app/tests/BUILD
src/my/app/tests/test.cc

ターゲット

パッケージはターゲットのコンテナです。ターゲットはパッケージの BUILDファイルで定義されます。ほとんどのターゲットは、ファイル とルール の 2 つの主要な種類のいずれかです。

ファイルはさらに 2 種類に分けられます。 ソースファイル は通常、人が作成してリポジトリにチェックインします。生成されたファイル(派生ファイルまたは出力ファイルとも呼ばれます) はチェックインされませんが、ソースファイルから生成されます。

2 番目の種類のターゲットは、ルール で宣言されます。 各ルール インスタンスは、入力ファイルのセットと出力ファイルのセットの関係を指定します。 ルールへの入力はソースファイルの場合もありますが、他のルールの出力の場合もあります。

ルールへの入力がソースファイルか生成されたファイルかは、ほとんどの場合関係ありません。重要なのは、そのファイルの内容だけです。このため、複雑なソースファイルを、ルールによって生成されたファイルに簡単に置き換えることができます。たとえば、高度に構造化されたファイルを手動で管理する負担が大きすぎる場合に、プログラムを作成して派生させることができます。そのファイルのコンシューマーを変更する必要はありません。逆に、生成されたファイルは、ローカルな変更のみでソースファイルに簡単に置き換えることができます。

ルールへの入力には、他のルール を含めることもできます。このような関係の正確な意味は、多くの場合、非常に複雑で、言語またはルールに依存しますが、直感的には簡単です。C++ ライブラリ ルール A の入力に別の C++ ライブラリ ルール B を指定できます。 この依存関係の効果は、コンパイル時に B のヘッダー ファイルが A で使用可能になり、リンク時に B のシンボルが A で使用可能になり、実行時に B のランタイムデータが A で使用可能になることです。

すべてのルールに共通する不変条件は、ルールによって生成されたファイルは常にルール自体と同じパッケージに属することです。別のパッケージにファイルを生成することはできません。ただし、ルールの入力が別のパッケージから取得されることは珍しくありません。

パッケージ グループは、特定のルールのアクセスを制限することを目的としたパッケージのセットです。パッケージ グループは、package_group 関数で定義されます。 パッケージ グループには、含まれるパッケージのリスト、名前、含まれる他のパッケージ グループの 3 つのプロパティがあります。パッケージ グループを参照できるのは、ルールの visibility 属性または package 関数の default_visibility 属性からのみです。パッケージ グループはファイルを生成または使用しません。詳細については、 package_group のドキュメントをご覧ください

ラベル