このページでは、Bazel に精通していることを前提としています。また、Bazel の機能を最大限に活用するためのプロジェクトの構築に関するガイドラインとアドバイスについても説明します。
全体的な目標は次のとおりです。
- きめ細かい依存関係を使用して、並列処理と増分処理を可能にします。
- 依存関係を適切にカプセル化するため。
- コードを適切に構造化してテストできるようにするため。
- 理解しやすく、メンテナンスが容易なビルド構成を作成します。
このガイドラインは要件ではありません。すべてのガイドラインを遵守できるプロジェクトもあります。lint のマニュアル ページに記載されているように、「厳密なチェックを行ってエラーを発生させない実際のプログラムを最初に作成した人に、特別な報酬が与えられます」とあります。ただし、これらの原則をできるだけ多く取り入れることで、プロジェクトの読みやすさ、エラーの発生率の低下、ビルド時間の短縮が期待できます。
このページでは、この RFC で説明されている要件レベルを使用しています。
ビルドとテストの実行
プロジェクトは、安定版ブランチで bazel build //...
と bazel test //...
を常に正常に実行できる必要があります。必要だが特定の状況でビルドしないターゲット(特定のビルドフラグが必要、特定のプラットフォームでビルドしない、使用許諾契約が必要など)には、できるだけ具体的にタグを付ける必要があります(例: 「requires-osx
」)。このタグ付けを使用すると、「手動」タグよりも細かいレベルでターゲットをフィルタリングでき、BUILD
ファイルを調べてターゲットの制限を把握できます。
サードパーティの依存関係
サードパーティの依存関係を宣言できます。
WORKSPACE
ファイルでリモート リポジトリとして宣言します。- または、ワークスペース ディレクトリの
third_party/
というディレクトリに配置します。
バイナリへの依存
可能な限り、すべてをソースからビルドする必要があります。一般的には、ライブラリの some-library.so
に依存するのではなく、BUILD
ファイルを作成し、そのソースから some-library.so
をビルドし、そのターゲットに依存します。
常にソースからビルドすることで、互換性のないフラグまたは異なるアーキテクチャでビルドされたライブラリがビルドで使用されなくなります。また、ソースでのみ機能するカバレッジ、静的分析、動的分析などの一部の機能もあります。
バージョニング
可能な限り、すべてのコードをヘッドからビルドすることをおすすめします。バージョンを使用する必要がある場合は、ターゲット名にバージョンを含めないでください(例: //guava-20.0
ではなく //guava
)。このように命名することで、ライブラリの更新が容易になります(ターゲットを 1 つだけ更新するだけで済みます)。また、ダイヤモンド依存関係の問題にもより強くなります。1 つのライブラリが guava-19.0
に依存し、もう 1 つが guava-20.0
に依存している場合、2 つの異なるバージョンに依存しようとするライブラリが作成される可能性があります。両方のターゲットを 1 つの guava
ライブラリに指す誤解を招くエイリアスを作成した場合、BUILD
ファイルは誤解を招きます。
.bazelrc
ファイルの使用
プロジェクト固有のオプションについては、workspace/.bazelrc
の構成ファイルを使用します(bazelrc の形式をご覧ください)。
ソース管理にチェックインしないプロジェクトのユーザーごとのオプションをサポートする場合は、次の行を含めます。
try-import %workspace%/user.bazelrc
(またはその他のファイル名)をworkspace/.bazelrc
して、user.bazelrc
を .gitignore
に追加します。
パッケージ
ビルド可能なファイルを含むディレクトリはすべてパッケージにする必要があります。BUILD
ファイルがサブディレクトリ内のファイルを参照している場合(srcs = ["a/b/C.java"]
など)、BUILD
ファイルをそのサブディレクトリに追加する必要があります。この構造が長くなるほど、循環する依存関係が誤って作成される可能性が高くなり、ターゲットのスコープがクリープし、更新が必要な逆依存関係の数が増えます。