Bazel クエリの使い方

<ph type="x-smartling-placeholder"></ph> 問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

このページでは、Bazel のクエリ言語を使用してトレースを開始する方法について説明します。 おすすめします。

言語の詳細と --output フラグの詳細については、以下をご覧ください。 リファレンス マニュアル、Bazel クエリ リファレンスBazel cquery リファレンスをご覧ください。以下の方法でサポートをご利用いただけます。 「bazel help query」または「bazel help cquery」と入力すると、 使用します。

ターゲットの欠落などのエラーを無視してクエリを実行するには、 --keep_going フラグ。

ルールの依存関係を見つける

//foo の依存関係を表示するには、次のコマンドを使用します。 Bazel クエリの deps 関数:

$ bazel query "deps(//foo)"
//foo:foo
//foo:foo-dep
...

これは、//foo のビルドに必要なすべてのターゲットのセットです。

2 つのパッケージ間の依存関係チェーンをトレースする

ライブラリ //third_party/zlib:zlibonly は、次の BUILD ファイルに存在しません。 //foo ですが、これは間接的な依存関係です。どうすれば どうなるでしょうか。ここには 2 つの便利な関数があります。 allpathssomepath。特定のキャンペーンを除外したり ツールの依存関係を --notool_deps で指定する(必要な場合) 可能なジョブがすべて含まれているわけではありません。

すべての依存関係のグラフを可視化するには、bazel クエリの出力を dot コマンドライン ツールを実行します。

$ bazel query "allpaths(//foo, third_party/...)" --notool_deps --output graph | dot -Tsvg > /tmp/deps.svg

依存関係グラフが大きく複雑な場合は、次のように 1 つのパスから始めると便利です。

$ bazel query "somepath(//foo:foo, third_party/zlib:zlibonly)"
//foo:foo
//translations/tools:translator
//translations/base:base
//third_party/py/MySQL:MySQL
//third_party/py/MySQL:_MySQL.so
//third_party/mysql:mysql
//third_party/zlib:zlibonly

allpaths--output graph を指定しない場合、 フラット化された依存関係グラフが表示されます。

$ bazel query "allpaths(//foo, third_party/...)"
  ...many errors detected in BUILD files...
//foo:foo
//translations/tools:translator
//translations/tools:aggregator
//translations/base:base
//tools/pkg:pex
//tools/pkg:pex_phase_one
//tools/pkg:pex_lib
//third_party/python:python_lib
//translations/tools:messages
//third_party/py/xml:xml
//third_party/py/xml:utils/boolean.so
//third_party/py/xml:parsers/sgmlop.so
//third_party/py/xml:parsers/pyexpat.so
//third_party/py/MySQL:MySQL
//third_party/py/MySQL:_MySQL.so
//third_party/mysql:mysql
//third_party/openssl:openssl
//third_party/zlib:zlibonly
//third_party/zlib:zlibonly_v1_2_3
//third_party/python:headers
//third_party/openssl:crypto

補足: 暗黙的な依存関係

//foo の BUILD ファイルが参照しない //translations/tools:aggregator。では、直接的な依存関係はどこにあるのでしょうか。

一部のルールには、追加のライブラリまたはツールに対する暗黙的な依存関係が含まれます。 たとえば、genproto ルールを作成するには、まずプロトコルを構築する必要があります。 コンパイラ。そのため、すべての genproto ルールは プロトコル コンパイラです。これらの依存関係はビルドファイルに記載されていません。 ビルドツールによって追加されますすべての暗黙的な依存関係は、 現時点では文書化されていません。--noimplicit_deps を使用すると、 クエリ結果から取得しますcquery の場合、これには解決済みのツールチェーンが含まれます。

逆依存関係

特定のターゲットに依存するターゲットのセットについて知りたい場合があります。たとえば コードを変更する場合は、そのコードを 壊そうとしています。rdeps(u, x) を使用すると、その逆の u の推移的クロージャ内の x 内のターゲットの依存関係。

Bazel の Sky クエリ 逆依存関係をクエリできる allrdeps 関数をサポートしています。 自動的に適用されます。

その他の用途

bazel query を使用すると、さまざまな依存関係を分析できます。

存在するもの ...

foo の下にはどのようなパッケージがありますか?

bazel query 'foo/...' --output package

foo パッケージではどのようなルールが定義されていますか?

bazel query 'kind(rule, foo:*)' --output label_kind

foo パッケージのルールによってどのようなファイルが生成されますか?

bazel query 'kind("generated file", //foo:*)'

スターラーク マクロ foo によって生成されるターゲット

bazel query 'attr(generator_function, foo, //path/to/search/...)'

//foo のビルドに必要な BUILD ファイルのセットは何ですか?

bazel query 'buildfiles(deps(//foo))' | cut -f1 -d:

test_suite が拡張される個々のテストは何ですか?

bazel query 'tests(//foo:smoke_tests)'

次のうち、C++ テストはどれですか。

bazel query 'kind(cc_.*, tests(//foo:smoke_tests))'

次のうち、小さいのはどれですか?中程度ですか?大規模、

bazel query 'attr(size, small, tests(//foo:smoke_tests))'

bazel query 'attr(size, medium, tests(//foo:smoke_tests))'

bazel query 'attr(size, large, tests(//foo:smoke_tests))'

foo の下でパターンに一致するテストは何ですか?

bazel query 'filter("pa?t", kind(".*_test rule", //foo/...))'

このパターンは正規表現であり、ルールの完全な名前に適用されます。Cloud Shell から

bazel query 'kind(".*_test rule", //foo/...)' | grep -E 'pa?t'

path/to/file/bar.java ファイルはどのパッケージに含まれていますか?

 bazel query path/to/file/bar.java --output=package

path/to/file/bar.java? のビルドラベルは何ですか。

bazel query path/to/file/bar.java

ファイル path/to/file/bar.java がソースとして含まれているルール ターゲットはどれですか?

fullname=$(bazel query path/to/file/bar.java)
bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"

どのようなパッケージ依存関係が存在するか

foo はどのようなパッケージに依存していますか?(foo をビルドするには何をチェックする必要がありますか)

bazel query 'buildfiles(deps(//foo:foo))' --output package

foo ツリーが依存しているパッケージ(foo/contrib を除く)は何ですか?

bazel query 'deps(foo/... except foo/contrib/...)' --output package

どのようなルールの依存関係が存在するか

bar はどの genproto ルールに依存しますか。

bazel query 'kind(genproto, deps(bar/...))'

Java バイナリルールによって推移的に依存する JNI(C++)ライブラリの定義をサーブレット ツリーで見つけます。

bazel query 'some(kind(cc_.*library, deps(kind(java_binary, //java/com/example/frontend/...))))' --output location
...それに依存するすべての Java バイナリの定義を見つけましょう
bazel query 'let jbs = kind(java_binary, //java/com/example/frontend/...) in
  let cls = kind(cc_.*library, deps($jbs)) in
    $jbs intersect allpaths($jbs, $cls)'

どのようなファイル依存関係が存在しているか ...

foo のビルドに必要な Java ソースファイルの完全なセットは何ですか。

ソースファイル:

bazel query 'kind("source file", deps(//path/to/target/foo/...))' | grep java$

生成されたファイル:

bazel query 'kind("generated file", deps(//path/to/target/foo/...))' | grep java$

QUX のテストのビルドに必要な Java ソースファイルの完全なセットは何ですか。

ソースファイル:

bazel query 'kind("source file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$

生成されたファイル:

bazel query 'kind("generated file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$

X と Y の依存関係にはどのような違いがありますか。

//foo が依存していて、//foo:foolib が依存していないターゲットは何ですか?

bazel query 'deps(//foo) except deps(//foo:foolib)'

//foo 本番環境バイナリが依存していないfoo テストで依存している C++ ライブラリはどれですか?

bazel query 'kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo))'

この依存関係が存在する理由

bargroups2 に依存する理由

bazel query 'somepath(bar/...,groups2/...:*)'

このクエリの結果が得られると、たいていは 1 つの 想定外または悪質かつ好ましくない bar の依存関係。その後、次のようにクエリをさらに絞り込むことができます。

docker/updater:updater_systestpy_test)から、依存する cc_library へのパスを示します。

bazel query 'let cc = kind(cc_library, deps(docker/updater:updater_systest)) in
  somepath(docker/updater:updater_systest, $cc)'

ライブラリ //photos/frontend:lib が同じライブラリ //third_party/jpeglib//third_party/jpeg の 2 つのバリアントに依存するのはなぜですか?

このクエリは、次のようになります。「この //photos/frontend:lib のサブグラフを表示して」 両方のライブラリに依存しますトポロジ順に表示した場合、最後の要素は 最も可能性の高い原因です

bazel query 'allpaths(//photos/frontend:lib, //third_party/jpeglib)
                intersect
               allpaths(//photos/frontend:lib, //third_party/jpeg)'
//photos/frontend:lib
//photos/frontend:lib_impl
//photos/frontend:lib_dispatcher
//photos/frontend:icons
//photos/frontend/modules/gadgets:gadget_icon
//photos/thumbnailer:thumbnail_lib
//third_party/jpeg/img:renderer

依存する内容

Y に依存するルールはどれですか?

bazel query 'bar/... intersect allpaths(bar/..., Y)'

T のパッケージ内で T に直接依存するターゲットは何ですか?

bazel query 'same_pkg_direct_rdeps(T)'

依存関係を解消するには

bar が X に依存しないようにするには、どのような依存関係パスを解除する必要がありますか?

グラフを svg ファイルに出力するには:

bazel query 'allpaths(bar/...,X)' --output graph | dot -Tsvg > /tmp/dep.svg

その他

//foo-tests ビルドには連続したステップがいくつありますか。

残念ながら、現時点ではクエリ言語では、 座標から最も遠いノードも x から始まりまでの最長パスの長さを 依存しています。maxrank を使用します。

bazel query 'deps(//foo-tests)' --output maxrank | tail -1
85 //third_party/zlib:zutil.c

この結果は、発生する必要がある長さ 85 のパスが存在することを示しています。 おすすめします。