Bazel は、ワークスペースと呼ばれるディレクトリ ツリーに整理されたソースコードからソフトウェアをビルドします。ワークスペース内のソースファイルは、ネストされたパッケージ階層に編成されます。各パッケージは、関連するソースファイルのセットと 1 つの BUILD
ファイルを含むディレクトリです。BUILD
ファイルは、ソースからビルドできるソフトウェア出力を指定します。
ワークスペース
ワークスペースは、ビルドするソフトウェアのソースファイルを含むファイル システム上のディレクトリ ツリーです。各ワークスペースには、WORKSPACE
という名前のテキスト ファイルがあります。このファイルは、空にすることも、出力のビルドに必要な外部依存関係への参照を含めることもできます。
WORKSPACE
というファイルを含むディレクトリは、ワークスペースのルートとみなされます。したがって、Bazel は、WORKSPACE
ファイルを含むサブディレクトリをルートとするワークスペース内のディレクトリ ツリーを無視して、別のワークスペースを形成します。
Bazel は、WORKSPACE
ファイルのエイリアスとして WORKSPACE.bazel
ファイルもサポートしています。両方のファイルが存在する場合は、WORKSPACE.bazel
が使用されます。
リポジトリ
コードはリポジトリにまとめられます。WORKSPACE
ファイルを含むディレクトリはメイン リポジトリのルートであり、@
とも呼ばれます。その他の(外部)リポジトリは、ワークスペース ルールを使用して WORKSPACE
ファイルで定義するか、Bzlmod システムのモジュールと拡張機能から生成されます。詳細については、外部依存関係の概要をご覧ください。
Bazel にバンドルされているワークスペース ルールは、Build Encyclopedia の「Workspace ルール」セクションと、埋め込みの Starlark リポジトリ ルールに関するドキュメントに記載されています。
外部リポジトリはそれ自体がリポジトリであるため、多くの場合、WORKSPACE
ファイルも含まれています。ただし、これらの追加の WORKSPACE
ファイルは Bazel で無視されます。特に、推移的に依存するリポジトリは自動的に追加されません。
パッケージ
リポジトリ内のコード編成の基本単位はパッケージです。パッケージは、関連ファイルのコレクションと、それらを使用して出力アーティファクトを生成する方法の仕様です。
パッケージは、BUILD
または BUILD.bazel
という名前の BUILD
ファイルを含むディレクトリとして定義されます。パッケージには、そのディレクトリ内のすべてのファイルと、その下のすべてのサブディレクトリが含まれます(ただし、それ自体に 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 を持つ場合もあります。この依存関係の効果により、A はコンパイル時に B のヘッダー ファイルを使用でき、リンク時に A は B のシンボルを使用でき、実行中には B のランタイム データを A で使用できます。
ルールによって生成されるファイルは常にルール自体と同じパッケージに属します。別のパッケージにファイルを生成することはできません。ただし、ルールの入力が別のパッケージから行われることは珍しくありません。
パッケージ グループは、特定のルールへのアクセスを制限することを目的としたパッケージのセットです。パッケージ グループは、package_group
関数で定義されます。プロパティには、パッケージに含まれるパッケージのリスト、名前、パッケージに含まれる他のパッケージ グループの 3 つのプロパティがあります。これを参照する方法は、ルールの visibility
属性または package
関数の default_visibility
属性からのみです。ファイルの生成や使用は行いません。詳細については、package_group
のドキュメントをご覧ください。