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

問題を報告する ソースを表示 ナイトリー · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

リポジトリ

Bazel ビルドで使用されるソースファイルは、リポジトリ(多くの場合は「repos」と省略されます)にまとめられています。リポジトリは、ルートに境界マーカー ファイルがあるディレクトリ ツリーです。このような境界マーカー ファイルは、MODULE.bazelREPO.bazel、以前のコンテキストでは WORKSPACEWORKSPACE.bazel などにできます。

現在の Bazel コマンドが実行されているリポジトリは、メイン リポジトリと呼ばれます。その他の(外部)リポジトリは、リポジトリ ルールで定義されます。詳細については、外部依存関係の概要をご覧ください。

ワークスペース

ワークスペースは、同じメイン リポジトリから実行されるすべての 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 のドキュメントをご覧ください。

ラベル