関数

目次

パッケージ

package(default_deprecation, default_testonly, default_visibility, features)

この関数は、後続のすべてのルールに適用されるメタデータを パッケージ化されています。パッケージ(BUILD ファイル)内で最大 1 回使用されます。

package() 関数は、モジュールの先頭にあるすべての load() ステートメントの直後に 表示されます。

引数

属性 説明
default_visibility

List of labels; optional

このパッケージのルールのデフォルトの公開設定。

このパッケージ内のすべてのルールは、このパッケージに含まれる公開設定に 属性(visibility で特に指定されていない限り) 属性を指定します。この構文の構文について詳しくは、 visibility のドキュメントをご覧ください。 パッケージのデフォルトの公開設定は exports_files: デフォルトでパブリックになります。

default_deprecation

String; optional

デフォルトの を設定します。 このパッケージ内のすべてのルールの deprecation メッセージ。

default_testonly

Boolean; optional; default is False except as noted

デフォルトの を設定します。 このパッケージ内のすべてのルールの testonly プロパティ。

javatests の下のパッケージの場合、デフォルト値は 1 です。

features

List strings; optional

この BUILD ファイルのセマンティクスに影響するさまざまなフラグを設定します。

この機能は主に、ビルドシステムの開発者が なんらかの特別な処理が必要なタグ パッケージをビルドします。次の場合以外は使用しないでください。 明示的にリクエストされた処理はありません。

以下の宣言では、このパッケージのルールが パッケージのメンバーにのみ表示されます グループ //foo:target。個別の公開設定宣言 存在する場合は、この指定をオーバーライドします。
package(default_visibility = ["//foo:target"])

package_group

package_group(name, packages, includes)

この関数は、一連のパッケージを定義します。 セットにラベルを関連付けますラベルは次の場所から参照できます: visibility 属性。

パッケージ グループは、主に公開設定に使用されます。一般公開されている ターゲットはソースツリー内のすべてのパッケージから参照できます。プライベートで 可視ターゲットは、自身のパッケージ内でのみ参照できます(サブパッケージ内では参照できません)。 これらの極端な間で、ターゲットは自身のパッケージへのアクセスに加えて、 1 つ以上のパッケージ グループで記述されるパッケージの ID です。詳細については、 説明については、このモジュールの 可視性 属性です。

グループに含まれるのは、 packages 属性、またはすでに他 1 つの属性に含まれています includes 属性で指定されたパッケージ グループ。

パッケージ グループは技術的にはターゲットですが、ルールでは作成されず、 可視性も保護されません

引数

属性 説明
name

Name; required

このターゲットの一意の名前。

packages

List of strings; optional

0 個以上のパッケージ仕様のリスト。

各パッケージ仕様の文字列には、次のいずれかを指定できます。 フォーム:

  1. リポジトリを含まないパッケージの完全な名前。 二重スラッシュで区切られます。たとえば、//foo/bar はパッケージを指定します。 パッケージと同じリポジトリに存在する できます。
  2. 上記と同じですが、末尾に /... を付けます。たとえば、 //foo/...//foo とそのすべてのリソースのセットを指定します。 構成します。//... は、現在の できます。
  3. 文字列 public または private。 すべてのパッケージを指定するか、またはパッケージなしを指定します。(このフォームには フラグ --incompatible_package_group_has_public_syntax を、 あります)。

さらに、最初の 2 種類のパッケージ仕様は、 否定することを示す - という接頭辞を付けます。

パッケージ グループにパッケージのうち、少なくとも 1 つに一致するパッケージが含まれている 肯定的な仕様で、否定的な仕様はない たとえば、値 [//foo/..., -//foo/tests/...] は、 次に含まれない //foo のサブパッケージがすべて含まれます。 //foo/tests のサブパッケージ。(//foo 自体は //foo/tests 自体は含まれません)。

公開設定のほか、バージョン 4 に 外部にデプロイされます

この属性がない場合は、 空のリストがあります。これは、次の要素を含むリストに private 限定。

注: Bazel 6.0 より前のバージョンでは、//... には、public と同じ従来の動作がありました。この 動作は修正されました。 --incompatible_fix_package_group_reporoot_syntax は 有効(Bazel 6.0 より後のデフォルト)です。

注: Bazel 6.0 より前では、この属性が次のようにシリアル化されています。 bazel query --output=proto の一部(または --output=xml など)、先頭のスラッシュは省略されます。対象 //pkg/foo/... は次のように出力されます。 \"pkg/foo/...\"。この動作は、次の場合に修正されます。 --incompatible_package_group_includes_double_slash は 有効(Bazel 6.0 より後のデフォルト)です。

includes

List of labels; optional

これに含まれる他のパッケージ グループ。

この属性のラベルは他のパッケージ グループを参照する必要があります。 参照先のパッケージ グループ内のパッケージも、このパッケージに含まれます。 含まれています。パッケージ グループの場合、これは推移的です。 a には、パッケージ グループ bb が含まれます パッケージ グループ c が含まれ、その後、すべてのパッケージが c さんも a のメンバーになります。

negated package 仕様と一緒に使用する場合、 各グループのパッケージのセットが個別に計算され、 複数の結果が結合されますつまり グループ内の仕様に影響を与えない場合、 クリックします。

次の package_group 宣言では、 「トロピカル」というラベルの含まれることになります。

package_group(
    name = "tropical",
    packages = [
        "//fruits/mango",
        "//fruits/orange",
        "//fruits/papaya/...",
    ],
)

次の宣言では、架空のインスタンスのパッケージ グループを指定します。 アプリケーション:

package_group(
    name = "fooapp",
    includes = [
        ":controller",
        ":model",
        ":view",
    ],
)

package_group(
    name = "model",
    packages = ["//fooapp/database"],
)

package_group(
    name = "view",
    packages = [
        "//fooapp/swingui",
        "//fooapp/webui",
    ],
)

package_group(
    name = "controller",
    packages = ["//fooapp/algorithm"],
)

exports_files

exports_files([label, ...], visibility, licenses)

exports_files() は、オブジェクトに属するファイルのリストを指定します。 他のパッケージにエクスポートされます。

パッケージの BUILD ファイルは、所属先のソースファイルを直接参照することしかできません。 明示的にエクスポートされている場合は、 exports_files() ステートメント。詳細を見る: ファイルの可視性に優れています。

従来の動作として、ルールへの入力として記述されたファイルもエクスポートされます。 デフォルトの表示状態のままで、 --incompatible_no_implicit_file_export 反転していますただし、この動作に依存するべきではありません。また、 Google Workspace から

引数

この引数は、現在のパッケージ内のファイルの名前のリストです。 可視性の宣言も指定できます。この場合、ファイルはすべての Pod に そのターゲットに公開されます。公開設定が指定されていない場合、 すべてのパッケージに表示されます。パッケージのデフォルトの公開設定が package で指定 使用します。ライセンス 指定することもできます。

次の例では、golden.txt、 テキスト ファイルが test_data パッケージから提供されるため、 パッケージで、たとえば data 属性内で使用できます。 含まれています。

# from //test_data/BUILD

exports_files(["golden.txt"])

glob

glob(include, exclude=[], exclude_directories=1, allow_empty=True)

glob は、特定のパスパターンに一致するすべてのファイルを検索するヘルパー関数です。 このメソッドは、パスの新しい変更可能な並べ替え済みリストを返します。Glob はファイルのみを検索 検索され、ソースファイルのみが検索されます(生成されたファイルや できます。

ソースファイルのラベルは、ファイルのパッケージ相対 URL が結果に含まれる場合 path は include パターンのいずれかに一致し、 exclude パターン。

include リストと exclude リストにパスパターンが含まれている 現在のパッケージに関連するものが出力されます。各パターンは、1 つまたは複数の 分割します通常の Unix パスと同様に、これらのセグメントは /。セグメントにはワイルドカードとして * を含めることができます。これは、次と一致します。 パスセグメント内のすべての部分文字列(空の部分文字列も含む)。ただし、 ディレクトリ区切り文字 /。このワイルドカードは複数回使用できます 1 つの経路セグメント内に収めますまた、** ワイルドカードは、 0 個以上の完全なパスセグメントを指定できますが、スタンドアロンのものとして宣言する必要があります 作成します

例:
  • foo/bar.txt は、foo/bar.txt ファイルと完全に一致します。 このパッケージ内
  • foo/*.txt は、foo/ ディレクトリ内のすべてのファイルに一致します。 ファイルの末尾が .txtfoo/ がサブパッケージの場合を除く)
  • foo/a*.htm*foo/ 内のすべてのファイルに一致します。 a で始まり、その後は任意の文字列( 空)、次に .htm を持ち、別の任意の文字列で終わります。 (foo/axx.htmfoo/a.html など)または foo/axxx.html
  • **/a.txt は、すべての a.txt ファイルをすべて このパッケージのサブディレクトリ
  • **/bar/**/*.txt は、すべての .txt ファイルをすべて 生成されたパスに少なくとも 1 つのディレクトリがある場合、このパッケージの barxxx/bar/yyy/zzz/a.txtbar/a.txt** はゼロにも一致する または bar/zzz/a.txt
  • ** は、このディレクトリのすべてのサブディレクトリ内のすべてのファイルに一致します。 荷物
  • foo**/a.txt は無効なパターンです。** は セグメントとして独立していて

exclude_directories 引数が有効(1 に設定)の場合、 結果では省略されます(デフォルトは 1)。

allow_empty 引数が False に設定されている場合は、 結果が次の場合は、glob 関数でエラーが発生します。 空のリストです。

いくつかの重要な制限事項と注意点があります。

  1. glob() は BUILD ファイルの評価中に実行されるため、 glob() はソースツリー内のファイルのみを照合し、照合しません。 表示できます。両方を必要とするターゲットを作成する場合 使用する場合は、生成されたファイルを明示的にリストし、 glob に出力します。をご覧ください。 :mylib:gen_java_srcs に置き換えます。

  2. ルールの名前がソースファイルと同じ名前の場合、ルールは 「シャドウ」表示されます。

    これを理解するために、glob() はリストを返すことを覚えておいてください。 そのため、他のルールで glob() を使用すると、属性(例: srcs = glob(["*.cc"]) など)は、 明示的に照合することもできます。たとえば、glob() の結果が ["Foo.java", "bar/Baz.java"] というルールですが、 「Foo.java」というパッケージです。(許可されていますが、Bazel では警告が表示されます)。 glob() のコンシューマは「Foo.java」を使用します。ルール (その出力)を「Foo.java」ではなく、表示されます。詳しくは、 GitHub 問題 #10395 をご覧ください。

  3. glob は、サブディレクトリ内のファイルと一致する場合があります。サブディレクトリ名 ワイルドカードを使用できます。しかし...
  4. ラベルはパッケージの境界を越えることはできず、glob はこれを許可する サブパッケージ内のファイルと一致しない。

    たとえば、パッケージ内の glob 式 **/*.cc です。 次の場合、xx/y/z.cc は含まれません。 x/y はパッケージとして存在します(または x/y/BUILD、または package-path の別の場所)。この glob 式の結果が実際に BUILD ファイルが存在することを意味します。つまり、同じ glob 式が 呼び出されたパッケージがない場合は x/y/z.cc を含めます。 x/y であるか、 --deleted_packages 設定されます。

  5. 上記の制限は、すべての glob 式に適用されます。 使用できます。
  6. ファイル名が . で始まる非表示ファイルは、次により完全に一致します。 *** の両方のワイルドカードを使用できます。隠しファイルとの照合を行う場合 複合パターンがある場合、パターンは . で始まる必要があります。たとえば *.*.txt.foo.txt と一致しますが、*.txt と一致します。 できません。 隠しディレクトリも同様に照合されます。隠しディレクトリ 入力として不要なファイルが含まれていることがあり、 メモリ消費量を削減できます除外する 非表示のディレクトリを「exclude」list 引数。
  7. 「**」ワイルドカードには角かっこが 1 つあります。すなわち、 "**" がパッケージのディレクトリ パスと一致しません。つまり、 たとえば、「glob(["**"], exclude_directories = 0)」はすべてのファイルに一致します 現在のパッケージのディレクトリに推移的 (ただし、サブパッケージのディレクトリには移動しません。前のセクションを参照してください)。 注記を参照)。

通常は、適切な拡張子(*.html など)を指定するようにしてください。 を使用します。より明示的な名前では、 自己記録であり、誤ってバックアップと照合したり emacs/vi/...の自動保存が可能です

ビルドルールを記述するときに、glob の要素を列挙できます。この たとえば、入力ごとに個別のルールを生成できます。詳しくは、 後述の拡張 glob の例をご覧ください。

glob の例

このディレクトリ内のすべての Java ファイルからビルドされた Java ライブラリを作成します。 :gen_java_srcs ルールによって生成されたすべてのファイルが含まれます。

java_library(
    name = "mylib",
    srcs = glob(["*.java"]) + [":gen_java_srcs"],
    deps = "...",
)

genrule(
    name = "gen_java_srcs",
    outs = [
        "Foo.java",
        "Bar.java",
    ],
    ...
)

すべての txt ファイルを testdata ディレクトリに含めます(experiment.txt を除く)。 testdata のサブディレクトリにあるファイルは含まれません。条件 それらのファイルを含める場合は、再帰 glob(**)を使用します。

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(
        ["testdata/*.txt"],
        exclude = ["testdata/experimental.txt"],
    ),
)

再帰的 Glob の例

testdata ディレクトリ内のすべての txt ファイルと、 そのサブディレクトリ(およびそのサブディレクトリ)の集合です。 BUILD ファイルを含むサブディレクトリは無視されます。(制限事項を確認) および上記の注意事項をご覧ください)。

sh_test(
    name = "mytest",
    srcs = ["mytest.sh"],
    data = glob(["testdata/**/*.txt"]),
)

このディレクトリ内のすべての Java ファイルと、 test という名前のディレクトリを含むパスは除きます。 ビルドを削減できるため、このパターンはできるだけ避けてください。 インクリメンタリティが高まり、ビルド時間が長くなります。

java_library(
    name = "mylib",
    srcs = glob(
        ["**/*.java"],
        exclude = ["**/testing/**"],
    ),
)

拡張された Glob の例

現在のディレクトリに *_test.cc の genrule を個別に作成する ファイル内の行数をカウントします。

# Conveniently, the build language supports list comprehensions.
[genrule(
    name = "count_lines_" + f[:-3],  # strip ".cc"
    srcs = [f],
    outs = ["%s-linecount.txt" % f[:-3]],
    cmd = "wc -l $< >$@",
 ) for f in glob(["*_test.cc"])]

上記の BUILD ファイルがパッケージ //foo にあり、このパッケージに 3 つの 見つかった後、a_test.cc、b_test.cc、c_test.cc という bazel query '//foo:all' は、生成されたすべてのルールを一覧表示します。

$ bazel query '//foo:all' | sort
//foo:count_lines_a_test
//foo:count_lines_b_test
//foo:count_lines_c_test

選択

select(
    {conditionA: valuesA, conditionB: valuesB, ...},
    no_match_error = "custom message"
)

select() は、ルール属性を作成するヘルパー関数です。 構成可能。 画像の右側を置き換えて、 ほぼ 属性の割り当てを行えば、その値がコマンドラインの Bazel フラグに依存するようになります。 たとえば、プラットフォーム固有の依存関係を定義したり、依存関係を ルールが「developer」で構築されているかどうかに応じて、異なるリソースを埋め込む 「release」との比較モードです。

基本的な使用方法は次のとおりです。

sh_binary(
    name = "mytarget",
    srcs = select({
        ":conditionA": ["mytarget_a.sh"],
        ":conditionB": ["mytarget_b.sh"],
        "//conditions:default": ["mytarget_default.sh"]
    })
)

これにより、次の srcs 属性が 通常のラベルを置き換えることで構成可能な sh_binary リスト割り当てを select 呼び出しでリストします。 照合します。各条件はラベルである 参照先 config_setting または constraint_value, 「一致する」ターゲットの構成が、想定される一連の 使用できます。mytarget#srcs の値は、 label list は現在の呼び出しと一致します。

注:

  • どの呼び出しでも、1 つの条件のみが選択されます。
  • 複数の条件が一致し、そのうちの 1 つが他の条件の特殊化である場合、 スペシャライゼーションが優先されます条件 B は 条件 A の特殊化(B にすべて同じフラグと制約がある場合) 値を A として追加し、追加のフラグまたは制約値として設定できます。また、 スペシャライゼーション解決では 注文を作成できるようには設計されていません (以下の例 2)をご覧ください。
  • 複数の条件が一致し、そのうちの 1 つがすべて Bazel はエラーで失敗します。
  • 特殊な疑似ラベル //conditions:default は次のとおりです。 一致するものとみなされます。この条件が 省略した場合は、エラーを避けるために、他のルールに一致する必要があります。
  • select はより大きなサイズの内部に埋め込むことができます 割り当てられています。したがって、srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...}) srcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]}) は有効な式です。
  • select はほとんどの属性に対応していますが、すべてではありません。非対応 ドキュメントでは nonconfigurable とマークされています。

    サブパッケージ

    subpackages(include, exclude=[], allow_empty=True)

    subpackages()glob() に似たヘルパー関数です。 サブパッケージをリストします。同じ glob() として指定され、任意のサブパッケージに一致します。 現在読み込み中の BUILD ファイルの直下の子孫である必要があります。include と include の詳細な説明と例については、glob を参照してください。 除外パターンを確認できます

    返されるサブパッケージのリストは並べ替えられ、次の内容が含まれます 現在の読み込みパッケージからの相対パスで、 include であり、exclude 内のものは対象外です。

    次の例では、パッケージ foo/BUILD のすべての直接サブパッケージが一覧表示されます。

    # The following BUILD files exist:
    # foo/BUILD
    # foo/bar/baz/BUILD
    # foo/sub/BUILD
    # foo/sub/deeper/BUILD
    #
    # In foo/BUILD a call to
    subs = subpackages(include = ["**"])
    
    # results in subs == ["sub", "bar/baz"]
    #
    # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of
    # 'foo'
    

    通常は、この関数を直接呼び出すのではなく、 ユーザーが「サブパッケージ」を使用しているモジュール skylib