このセクションでは、多くの関数またはビルドルールに共通するさまざまな用語とコンセプトを定義します。
目次
- Bourne シェルのトークン化
- ラベルの拡張
- ほとんどのビルドルールで定義されている一般的な属性
- すべてのビルドルールに共通の属性
- すべてのテストルールに共通の属性(*_test)
- すべてのバイナリルールに共通する属性(*_binary)
- 設定可能な属性
- 暗黙的な出力ターゲット
Bourne シェルのトークン化
一部のルールの特定の文字列属性は、Bourne シェルのトークン化ルールに従って複数の単語に分割されます。引用符で囲まれていないスペースは別々の単語を区切り、単一引用符と二重引用符はトークン化を防止するために使用されます。
このトークン化の対象となる属性は、このドキュメントの定義で明示的に示されています。
一般に、「Make」変数の拡張と Bourne シェルのトークン化の対象となる属性は、コンパイラやその他のツールに任意のオプションを渡すために使用されます。このような属性の例としては、cc_library.copts
と java_library.javacopts
があります。これらの置換を組み合わせることで、1 つの文字列変数を、構成固有のオプション単語のリストに展開できます。
ラベルの拡張
ごく一部のルールの文字列属性にはラベル拡張が適用されます。たとえば、//mypkg:target
のように、文字列に有効なラベルが部分文字列として含まれており、そのラベルが現在のルールの前提条件として宣言されている場合、ターゲットで表されるファイルのパスに展開されます。
属性の例としては、genrule.cmd
や cc_binary.linkopts
が挙げられます。詳細は、相対ラベルが展開されているかどうか、複数のファイルに展開されるラベルの処理方法など、問題ごとに大きく異なる場合があります。詳細については、ルール属性のドキュメントをご覧ください。
ほとんどのビルドルールで定義されている一般的な属性
このセクションでは、多くのビルドルールで定義されている属性について説明します(すべてではありません)。
属性 | 説明 |
---|---|
data |
実行時にこのルールで必要なファイル。ファイルまたはルールのターゲットを一覧表示できます。通常、すべてのターゲットを許可します。
実行時に他の入力を使用する可能性がある入力を処理する場合は、新しいルールで |
deps |
このターゲットの依存関係。通常は、ルール ターゲットのみを一覧表示します。(一部のルールではファイルを直接 言語固有のルールは通常、リストされたターゲットを特定のプロバイダを持つルールに制限します。
ほとんどの場合、 |
licenses |
このターゲットに使用するライセンス タイプの文字列のリスト。これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。この属性は使用しないでください。 |
srcs |
このルールによって処理または含まれているファイル。通常、ファイルを直接リストしますが、ルール ターゲット( 多くの場合、言語固有のルールでは、リストにあるファイルに特定のファイル拡張子が必要です。 |
すべてのビルドルールに共通の属性
このセクションでは、すべてのビルドルールに暗黙的に追加される属性について説明します。
属性 | 説明 |
---|---|
compatible_with |
デフォルトのサポート対象環境に加えて、このターゲットのビルド先となる環境のリスト。 これは Bazel の制約システムの一部であり、ユーザーは依存可能なターゲットと依存できないターゲットを宣言できます。たとえば、外部にデプロイ可能なバイナリは、会社のシークレット コードがあるライブラリに依存しないでください。詳しくは、 ConstraintSemantics をご覧ください。 |
deprecation |
このターゲットに関連付けられた警告の警告メッセージ。通常、これはターゲットが古くなった、別のルールに置き換わった、パッケージで非公開になっている、またはなんらかの理由で有害であると見なされることをユーザーに知らせるために使用されます。メッセージを回避するために必要な変更点を簡単に確認できるように、いくつかの参照(ウェブページ、バグ番号、移行 CL の例など)を含めることをおすすめします。代替として使用できる新しいターゲットがある場合は、古いターゲットのすべてのユーザーを移行することをおすすめします。
この属性はビルド方法には影響しませんが、ビルドツールの診断出力に影響する可能性があります。 パッケージ内の依存関係はこの警告から除外されます。たとえば、非推奨のルールのテストを作成しても、警告は発生しません。 非推奨のターゲットが別の非推奨のターゲットに依存している場合、警告メッセージは発行されません。 ターゲットの使用を停止すると、ターゲットを削除できます。 |
distribs |
この特定のターゲットに使用される配布方法の文字列のリスト。これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。この属性は使用しないでください。 |
exec_compatible_with |
このターゲットの実行プラットフォームに存在する必要がある |
exec_properties |
このターゲット用に選択されたプラットフォームの プラットフォーム レベルとターゲット レベルのプロパティの両方にキーがある場合、値はターゲットから取得されます。 |
features |
特徴は、ターゲットで有効または無効にできる文字列タグです。機能の意味はルール自体によって異なります。 この |
restricted_to |
デフォルトでサポートされる環境ではなく、このターゲット用に構築できる環境のリスト。
これは Bazel の制約システムの一部です。詳しくは、 |
tags |
タグはあらゆるルールで使用できます。テストルールと
テストまたは
通常、テストのタグは、デバッグおよびリリース プロセスにおけるテストの役割にアノテーションを付けるために使用されます。通常、タグは、ランタイムのアノテーションがない C++ テストと Python テストで特に便利です。タグとサイズの要素を使用すると、コードベースのチェックイン ポリシーに基づいて一連のテストを柔軟に組み立てることができます。
テストルールの
|
target_compatible_with |
このターゲットが互換性があると見なされるには、ターゲット プラットフォームに存在する必要がある 互換性のないターゲットに推移的に依存するターゲット自体は互換性がないとみなされます。また、ビルドとテストもスキップされます。 空のリスト(デフォルト)は、ターゲットがすべてのプラットフォームと互換性があることを示します。
Workspace ルール以外のすべてのルールでこの属性がサポートされます。一部のルールでは、この属性は効果がありません。たとえば、
互換性のないターゲットのスキップについて詳しくは、プラットフォームのページをご覧ください。 |
testonly |
True の場合、テスト専用ターゲット(テストなど)のみがこのターゲットに依存できます。
同様に、
テスト( この属性は、本番環境にリリースされるバイナリにターゲットが含まれないようにすることを目的としています。 testonly は実行時ではなくビルド時に適用され、依存関係ツリーにクチコミが拡散するため、慎重に適用する必要があります。たとえば、単体テストに役立つスタブと疑似も、本番環境にリリースされるのと同じバイナリを使用する統合テストに役立つ可能性があるため、テスト専用としてマークするべきではありません。逆に、通常の動作を無条件にオーバーライドするなど、リンクするのも危険なルールは、確実にテスト専用としてマークする必要があります。 |
toolchains |
この変数に変数の作成を許可するターゲットのセット。これらのターゲットは、
これは、プラットフォームに依存する構成のルール実装で使用されるツールチェーンの解決のコンセプトとは異なることに注意してください。この属性を使用して、ターゲットで使用する特定の |
visibility |
ターゲットの |
すべてのテストルールに共通の属性(*_test)
このセクションでは、すべてのテストルールに共通の属性について説明します。
属性 | 説明 | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
args |
これらの引数は、 |
||||||||||||||||||||
env |
この属性は、 |
||||||||||||||||||||
env_inherit |
この属性は、 |
||||||||||||||||||||
size |
テスト ターゲットの「負荷」を指定します。実行に必要な時間やリソースの量などです。 単体テストは「小規模」、統合テストは「中」、エンドツーエンド テストは「大規模」または「大規模」とみなされます。Bazel は、サイズを使用してデフォルトのタイムアウトを決定します。これは テストサイズは、次のデフォルトのタイムアウトに対応し、ローカル リソースのピーク使用量を想定しています。
テストを生成するときに、環境変数 |
||||||||||||||||||||
timeout |
テストの実行が終わるまでの推定時間。
テストのサイズ属性はリソースの見積もりを制御しますが、テストのタイムアウトは個別に設定できます。明示的に指定しない場合、タイムアウトはテストのサイズに基づきます。テスト タイムアウトは、
上記以外の場合、テスト タイムアウトは 環境変数 |
||||||||||||||||||||
flaky |
テストを不安定とマークします。 設定すると、テストが最大 3 回実行され、失敗するたびにテストが失敗します。この属性はデフォルトで False に設定されており、テストは 1 回だけ実行されます。一般に、この属性の使用はおすすめしません。アサーションがサポートされている場合は、テストに必ず合格する必要があります。 |
||||||||||||||||||||
shard_count |
テストの実行に使用する並列シャードの数を指定します。 この値は、テストを実行する並列シャードの数を決定するために使用されるヒューリスティックをオーバーライドします。一部のテストルールでは、最初にシャーディングを有効にするためにこのパラメータが必要になることがあります。 テストのシャーディングが有効になっている場合、テストを生成するときに、環境変数 シャーディングでは、テストランナーがテスト シャーディング プロトコルをサポートする必要があります。そうしない場合、ほとんどのシャードごとにすべてのテストが実行される可能性がありますが、これは望ましいことではありません。 シャーディングの詳細については、Test Encyclopedia のテストのシャーディングをご覧ください。 |
||||||||||||||||||||
local |
サンドボックス化せずに、テストをローカルで強制的に実行します。 True に設定すると、タグ「 |
すべてのバイナリルールに共通する属性(*_binary)
このセクションでは、すべてのバイナリルールに共通の属性について説明します。
属性 | 説明 |
---|---|
args |
Bazel が
注: Bazel の外部でターゲットを実行した場合( |
env |
この属性は、
注: Bazel の外部でターゲットを実行する場合(たとえば、 |
output_licenses |
このバイナリによって生成された出力ファイルのライセンス。 これは、Bazel で使用されなくなった非推奨のライセンス API の一部です。この属性は使用しないでください。 |
設定可能な属性
ほとんどの属性は「構成可能」です。つまり、ターゲットがさまざまな方法でビルドされるときにそれらの値が変化する可能性があります。具体的には、Bazel コマンドラインに渡されたフラグや、ターゲットをリクエストしているダウンストリームの依存関係によって、構成可能な属性が異なる場合があります。たとえば、複数のプラットフォームやコンパイル モードのターゲットをカスタマイズする場合に使用できます。
次の例では、ターゲット アーキテクチャごとに異なるソースを宣言しています。bazel build :multiplatform_lib --cpu x86
を実行すると、x86_impl.cc
を使用してターゲットがビルドされますが、--cpu arm
を置き換えると arm_impl.cc
が使用されます。
cc_library( name = "multiplatform_lib", srcs = select({ ":x86_mode": ["x86_impl.cc"], ":arm_mode": ["arm_impl.cc"] }) ) config_setting( name = "x86_mode", values = { "cpu": "x86" } ) config_setting( name = "arm_mode", values = { "cpu": "arm" } )
select()
関数は、ターゲットの構成を満たしている config_setting
条件または constraint_value
条件に基づいて、構成可能な属性に異なる代替値を選択します。
Bazel は、マクロを処理した後(正確には
読み込みフェーズと分析フェーズの間)に、構成可能な属性を評価します。select()
評価の前に行われる処理は、select()
が選択するブランチを認識しません。たとえば、マクロは、選択したブランチに基づいて動作を変更することはできません。また、bazel query
はターゲットの構成可能な依存関係に関する保守的な推測のみを行うことができます。ルールとマクロで select()
を使用する方法について詳しくは、
こちらのよくある質問をご覧ください。
ドキュメントで nonconfigurable
とマークされている属性ではこの機能を使用できません。通常は、構成できない属性です。Bazel は select()
の解決方法を決定する前に、その値を認識する必要があるからです。
詳細については、 構成可能なビルド属性をご覧ください。
暗黙的な出力ターゲット
C++ の暗黙的出力は非推奨になりました。可能であれば、他の言語では使用しないでください。非推奨パスはまだありませんが、最終的には非推奨になる予定です。
BUILD ファイルでビルドルールを定義する場合、パッケージ内で新しい名前付きルール ターゲットを明示的に宣言します。多くのビルドルール関数は、コンテンツと特定のルール固有の意味を持つ 1 つ以上の出力ファイル ターゲットを暗黙的に伴います。たとえば、java_binary(name='foo', ...)
ルールを明示的に宣言する場合、出力ファイル ターゲット foo_deploy.jar
を同じパッケージのメンバーとして暗黙的に宣言します。
(このターゲットはデプロイに適した自己完結型の Java アーカイブです)。
暗黙的な出力ターゲットは、グローバル ターゲット グラフのトップクラスのメンバーです。他のターゲットと同様に、最上位のビルドコマンドで指定されている場合、または他のビルド ターゲットの前提条件となっている場合に、オンデマンドでビルドされます。BUILD ファイルで依存関係として参照できます。また、bazel query
などの分析ツールの出力で確認できます。
ルールのドキュメントには、その種類のビルドルールごとに、その種類のルールの宣言に伴う暗黙的な出力の名前と内容を説明する特別なセクションがあります。
ビルドシステムで使用される 2 つの Namespace の重要な違いはわずかです。ラベルはルールまたはファイルであるターゲットを識別します。ファイル ターゲットは、ソース(または入力)ファイル ターゲットと派生(出力)ファイル ターゲットに分割できます。これらは、BUILD ファイルで記述することも、コマンドラインからビルドすることも、bazel query
を使用して調べることもできます。これがターゲット名前空間です。各ファイル ターゲットは、ディスク上の 1 つの実際のファイル(ファイル システム名前空間)に対応します。各ルール ターゲットは、ディスク上の 0 個以上の実際のファイルに対応しています。対応するターゲットのないディスク上のファイルが存在する可能性があります。たとえば、C++ コンパイル中に生成された .o
オブジェクト ファイルは、BUILD ファイル内から、またはコマンドラインから参照できません。
このように、ビルドツールはジョブの実行方法に関する特定の実装の詳細を非表示にできます。詳細については、BUILD コンセプト リファレンスをご覧ください。