このページでは、Bazel に精通していることを前提として、Bazel の機能を最大限に活用できるようにプロジェクトを構成するためのガイドラインとアドバイスを提供します。
全体的な目標は次のとおりです。
- きめ細かい依存関係を使用して、並列処理とインクリメンタリティを実現する。
- 依存関係を適切にカプセル化しておく。
- コードを適切に構造化し、テストしやすくするため。
- 理解しやすく維持しやすいビルド構成を作成すること。
このガイドラインは要件ではなく、少数のプロジェクトは できます。lint の man ページには、「厳格なチェックでエラーが発生しない実際のプログラムを最初に作成した人に特別な報酬が贈られます」と記載されています。ただし、これらの原則をできるだけ多く取り入れることで、 プロジェクトが読みやすくなり、エラーが発生しにくくなり、ビルド時間を短縮できます。
このページでは、この RFC で説明されている要件レベルを使用しています。
ビルドとテストの実行
プロジェクトは、安定したブランチで常に bazel build //...
と bazel test //...
を正常に実行できる必要があります。必要であるが特定の状況下ではビルドされないターゲット(特定のビルドフラグが必要な場合、特定のプラットフォームでビルドされない場合、ライセンス契約が必要な場合など)には、できるだけ具体的にタグを付ける必要があります(例: requires-osx
)。このタグ付けにより、ターゲットを「手動」タグよりもきめ細かくフィルタリングできます。また、BUILD
ファイルを検査するユーザーは、ターゲットの制限を把握できます。
サードパーティの依存関係
サードパーティの依存関係は宣言できます。
MODULE.bazel
ファイルでリモート リポジトリとして宣言します。- または、ワークスペース ディレクトリの
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
に user.bazelrc
を追加します。
パッケージ
ビルド可能なファイルを含むすべてのディレクトリがパッケージである必要があります。BUILD
ファイルがサブディレクトリ内のファイルを参照している場合(srcs = ["a/b/C.java"]
など)、BUILD
ファイルをそのサブディレクトリに追加する必要があります。この構造が存在する時間が長くなるほど、循環依存関係が意図せず作成される可能性が高くなり、ターゲットのスコープが拡大し、リバース依存関係の更新が必要になる数が増えます。