Halaman ini membahas cara untuk mulai menggunakan bahasa kueri Bazel untuk melacak dependensi dalam kode Anda.
Untuk detail bahasa dan detail tanda --output
, lihat
manual referensi, referensi kueri Bazel
dan Referensi cquery Bazel. Anda dapat memperoleh bantuan dengan
mengetik bazel help query
atau bazel help cquery
pada
command line.
Untuk menjalankan kueri sambil mengabaikan error seperti target yang hilang, gunakan metode
--keep_going
.
Menemukan dependensi suatu aturan
Untuk melihat dependensi //foo
, gunakan atribut
Fungsi deps
dalam kueri bazel:
$ bazel query "deps(//foo)" //foo:foo //foo:foo-dep ...
Ini adalah kumpulan semua target yang diperlukan untuk membangun //foo
.
Melacak rantai dependensi antara dua paket
Library //third_party/zlib:zlibonly
tidak ada dalam file BUILD untuk
//foo
, tetapi merupakan dependensi tidak langsung. Bagaimana cara
kita melacak jalur
dependensi ini? Ada dua fungsi yang berguna di sini:
allpaths
dan somepath
. Anda mungkin juga
ingin mengecualikan
dependensi alat dengan --notool_deps
jika Anda hanya mementingkan
apa yang termasuk dalam artefak yang Anda buat, dan
tidak semua pekerjaan yang memungkinkan.
Untuk memvisualisasikan grafik dari semua dependensi, menyalurkan output kueri{i> <i}bazel melalui
alat command line dot
:
$ bazel query "allpaths(//foo, third_party/...)" --notool_deps --output graph | dot -Tsvg > /tmp/deps.svg
Ketika grafik dependensi besar dan rumit, memulai dengan satu jalur akan sangat membantu:
$ 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
Jika Anda tidak menentukan --output graph
dengan allpaths
,
Anda akan mendapatkan daftar grafik dependensi yang
disatukan.
$ 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
Selain: dependensi implisit
File BUILD untuk //foo
tidak pernah merujuk
//translations/tools:aggregator
. Jadi, di mana dependensi langsungnya?
Aturan tertentu menyertakan dependensi implisit pada library atau alat tambahan.
Misalnya, untuk membuat aturan genproto
, Anda harus terlebih dahulu membuat Protokol
Compiler, sehingga setiap aturan genproto
membawa dependensi implisit pada
kompilator protokol. Dependensi ini tidak disebutkan dalam file build,
tetapi ditambahkan oleh alat build. Set lengkap dependensi implisit adalah
saat ini tidak terdokumentasi. Menggunakan --noimplicit_deps
memungkinkan Anda untuk memfilter
dependensi ini dari hasil kueri Anda. Untuk kueri, ini akan menyertakan toolchain yang telah di-resolve.
Mengembalikan dependensi
Anda mungkin ingin mengetahui kumpulan target yang bergantung pada beberapa target. Contohnya,
jika Anda akan mengubah beberapa kode, Anda mungkin ingin tahu apa kode lain
akan rusak. Anda dapat menggunakan rdeps(u, x)
untuk menemukan respons
dependensi target di x
dalam penutupan transitif u
.
Kueri Sky Bazel
mendukung fungsi allrdeps
yang memungkinkan Anda untuk mengkueri dependensi balik
di alam semesta yang Anda tentukan.
Penggunaan lain-lain
Anda dapat menggunakan bazel query
untuk menganalisis banyak hubungan dependensi.
Yang ada ...
Paket apa yang ada di bawah foo
?
bazel query 'foo/...' --output package
Aturan apa yang ditentukan dalam paket foo
?
bazel query 'kind(rule, foo:*)' --output label_kind
File apa saja yang dibuat oleh aturan dalam paket foo
?
bazel query 'kind("generated file", //foo:*)'
Target apa yang dihasilkan oleh makro starlark foo
?
bazel query 'attr(generator_function, foo, //path/to/search/...)'
Apa kumpulan file BUILD yang diperlukan untuk membangun //foo
?
bazel query 'buildfiles(deps(//foo))' | cut -f1 -d:
Apa saja pengujian individual tempat test_suite
diperluas?
bazel query 'tests(//foo:smoke_tests)'
Manakah yang merupakan pengujian C++?
bazel query 'kind(cc_.*, tests(//foo:smoke_tests))'
Manakah dari yang kecil? Sedang? Besar?
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))'
Apa saja pengujian di bawah foo
yang cocok dengan suatu pola?
bazel query 'filter("pa?t", kind(".*_test rule", //foo/...))'
Polanya adalah ekspresi reguler dan diterapkan ke nama lengkap aturan. Ini mirip dengan melakukan
bazel query 'kind(".*_test rule", //foo/...)' | grep -E 'pa?t'
Paket apa yang berisi file path/to/file/bar.java
?
bazel query path/to/file/bar.java --output=package
Apa label build untuk path/to/file/bar.java?
bazel query path/to/file/bar.java
Target aturan apa yang berisi file path/to/file/bar.java
sebagai sumber?
fullname=$(bazel query path/to/file/bar.java) bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"
Apa saja dependensi paket yang ada ...
Paket apa yang diandalkan oleh foo
? (Apa yang perlu saya periksa untuk membangun foo
)
bazel query 'buildfiles(deps(//foo:foo))' --output package
Paket apa yang diandalkan oleh hierarki foo
, tidak termasuk foo/contrib
?
bazel query 'deps(foo/... except foo/contrib/...)' --output package
Apa saja dependensi aturan yang ada ...
Aturan genproto apa yang bergantung pada bar?
bazel query 'kind(genproto, deps(bar/...))'
Temukan definisi beberapa library JNI (C++) yang bergantung secara transitif oleh aturan biner Java di pohon servlet.
bazel query 'some(kind(cc_.*library, deps(kind(java_binary, //java/com/example/frontend/...))))' --output location
...Sekarang temukan definisi semua biner Java yang bergantung pada biner tersebut
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)'
Apa saja dependensi file yang ada ...
Apa saja kumpulan file sumber Java lengkap yang diperlukan untuk membangun foo?
File sumber:
bazel query 'kind("source file", deps(//path/to/target/foo/...))' | grep java$
File yang dihasilkan:
bazel query 'kind("generated file", deps(//path/to/target/foo/...))' | grep java$
Apa kumpulan file sumber Java lengkap yang diperlukan untuk membuat pengujian QUX?
File sumber:
bazel query 'kind("source file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$
File yang dihasilkan:
bazel query 'kind("generated file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$
Apa saja perbedaan dalam dependensi antara X dan Y yang ada ...
Target apa yang tidak bergantung pada //foo
?//foo:foolib
bazel query 'deps(//foo) except deps(//foo:foolib)'
Library C++ apa yang bergantung pada pengujian foo
dan tidak bergantung pada biner produksi //foo
?
bazel query 'kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo))'
Mengapa ada dependensi ini ...
Mengapa bar
bergantung pada groups2
?
bazel query 'somepath(bar/...,groups2/...:*)'
Setelah Anda mendapatkan hasil kueri ini, Anda akan sering menemukan bahwa
berbeda sebagai target yang tidak terduga atau berat dan tidak diinginkan
dependensi dari bar
. Kueri tersebut kemudian dapat disaring menjadi:
Tampilkan jalur dari docker/updater:updater_systest
(py_test
) ke beberapa cc_library
yang bergantung padanya:
bazel query 'let cc = kind(cc_library, deps(docker/updater:updater_systest)) in somepath(docker/updater:updater_systest, $cc)'
Mengapa library //photos/frontend:lib
bergantung pada dua varian dari library //third_party/jpeglib
dan //third_party/jpeg
yang sama?
Kueri ini meringkas: "tunjukkan subgrafik //photos/frontend:lib
yang
bergantung pada kedua library". Ketika ditampilkan dalam urutan
topologis, elemen terakhir
dari hasilnya adalah penyebab
yang paling mungkin.
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
Yang bergantung pada ...
Aturan apa di bawah batang yang bergantung pada Y?
bazel query 'bar/... intersect allpaths(bar/..., Y)'
Target apa yang secara langsung bergantung pada T, dalam paket T?
bazel query 'same_pkg_direct_rdeps(T)'
Bagaimana cara menghentikan dependensi ...
Jalur dependensi apa yang harus saya putuskan agar bar
tidak lagi bergantung pada X?
Untuk menghasilkan output grafik ke file svg
:
bazel query 'allpaths(bar/...,X)' --output graph | dot -Tsvg > /tmp/dep.svg
Lain-lain
Berapa banyak langkah berurutan yang ada dalam build //foo-tests
?
Sayangnya, bahasa kueri saat ini tidak dapat memberi Anda jalur terpanjang
dari x ke y, tetapi metode tersebut dapat menemukan (atau lebih tepatnya a) node yang paling jauh dari
titik awal, atau tunjukkan panjang jalur terpanjang dari x ke setiap
y yang menjadi dependensinya. Gunakan maxrank
:
bazel query 'deps(//foo-tests)' --output maxrank | tail -1 85 //third_party/zlib:zutil.c
Hasilnya menunjukkan bahwa ada jalur dengan panjang 85 yang harus terjadi di dalam build ini.