このページでは、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 つの便利な関数があります。
allpaths
と somepath
。特定のキャンペーンを除外したり
ツールの依存関係を --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))'
この依存関係が存在する理由
bar
が groups2
に依存する理由
bazel query 'somepath(bar/...,groups2/...:*)'
このクエリの結果が得られると、たいていは 1 つの
想定外または悪質かつ好ましくない
bar
の依存関係。その後、次のようにクエリをさらに絞り込むことができます。
docker/updater:updater_systest
(py_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 のパスが存在することを示しています。 おすすめします。