Bu sayfada, kodunuzdaki bağımlılıkları izlemek için Bazel'in sorgu dilini kullanmaya nasıl başlayacağınız açıklanmaktadır.
Dil ayrıntıları ve --output
işaret ayrıntıları için lütfen referans kılavuzları olan Bazel sorgu referansı ve Bazel cquery referansı'na bakın. Komut satırına bazel help query
veya bazel help cquery
yazarak yardım alabilirsiniz.
Hedeflerin eksik olması gibi hataları yoksayarak sorgu yürütmek için --keep_going
işaretini kullanın.
Bir kuralın bağımlılıklarını bulma
//foo
öğesinin bağımlılıklarını görmek için bazel sorgusunda deps
işlevini kullanın:
$ bazel query "deps(//foo)" //foo:foo //foo:foo-dep ...
Bu, //foo
oluşturmak için gereken tüm hedeflerin kümesidir.
İki paket arasındaki bağımlılık zincirini izleme
Kitaplık //third_party/zlib:zlibonly
, //foo
için BUILD dosyasında değil ancak dolaylı bir bağımlı öğe. Bu bağımlılık yolunu nasıl izleyebiliriz? Burada iki faydalı işlev vardır: allpaths
ve somepath
. Yalnızca oluşturduğunuz yapıda yer alanlarla ilgileniyorsanız ve olası tüm işlerle ilgilenmiyorsanız --notool_deps
ile araç bağımlılıklarını hariç tutmak da isteyebilirsiniz.
Tüm bağımlılıkların grafiğini görselleştirmek için bazel sorgu çıkışını dot
komut satırı aracından geçirin:
$ bazel query "allpaths(//foo, third_party/...)" --notool_deps --output graph | dot -Tsvg > /tmp/deps.svg
Bağımlılık grafiği büyük ve karmaşık olduğunda tek bir yoldan başlamak faydalı olabilir:
$ 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
--output graph
ile allpaths
değerini belirtmezseniz bağımlılık grafiğinin düzleştirilmiş bir listesini alırsınız.
$ 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
Not: Örtülü bağımlılıklar
//foo
için BUILD dosyası hiçbir zaman //translations/tools:aggregator
öğesine referans vermiyor. Peki doğrudan bağımlılık nerede?
Bazı kurallar, ek kitaplıklar veya araçlarla ilgili örtülü bağımlılıklar içerir.
Örneğin, bir genproto
kuralı oluşturmak için önce Protocol
Compiler'ı oluşturmanız gerekir. Bu nedenle, her genproto
kuralı, protokol derleyicisine örtülü bir bağımlılık taşır. Bu bağımlılıklar derleme dosyasında belirtilmez ancak derleme aracı tarafından eklenir. Tam örtülü bağımlılık kümesi şu anda belgelenmemiştir. --noimplicit_deps
kullanarak bu bağımlılıkları sorgu sonuçlarınızdan filtreleyebilirsiniz. cquery için bu, çözümlenmiş araç zincirlerini içerir.
Ters bağımlılıklar
Bazı hedeflere bağlı olan hedef grubunu bilmek isteyebilirsiniz. Örneğin, bir kodu değiştirecekseniz hangi kodu bozacağınızı bilmek isteyebilirsiniz. rdeps(u, x)
kullanarak u
'nin geçişli kapanımı içindeki x
hedeflerinin ters bağımlılıklarını bulabilirsiniz.
Bazel'in Sky Query'si, allrdeps
işlevini destekler. Bu işlev, belirttiğiniz bir evrende ters bağımlılıkları sorgulamanıza olanak tanır.
Çeşitli kullanımlar
Birçok bağımlılık ilişkisini analiz etmek için bazel query
kullanabilirsiniz.
Ne var? ...
foo
altında hangi paketler var?
bazel query 'foo/...' --output package
foo
paketinde hangi kurallar tanımlanır?
bazel query 'kind(rule, foo:*)' --output label_kind
foo
paketindeki kurallar hangi dosyaları oluşturur?
bazel query 'kind("generated file", //foo:*)'
Hangi hedefler foo
starlark makrosu tarafından oluşturulur?
bazel query 'attr(generator_function, foo, //path/to/search/...)'
//foo
öğesini oluşturmak için hangi BUILD dosyaları gerekir?
bazel query 'buildfiles(deps(//foo))' | cut -f1 -d:
test_suite
hangi testlere genişletilir?
bazel query 'tests(//foo:smoke_tests)'
Bunlardan hangileri C++ testleridir?
bazel query 'kind(cc_.*, tests(//foo:smoke_tests))'
Bunlardan hangileri küçüktür? Orta mı? Büyük mü?
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
altında hangi testler bir kalıpla eşleşiyor?
bazel query 'filter("pa?t", kind(".*_test rule", //foo/...))'
Kalıp bir normal ifadedir ve kuralın tam adına uygulanır. Bu,
bazel query 'kind(".*_test rule", //foo/...)' | grep -E 'pa?t'
Hangi paket path/to/file/bar.java
dosyasını içeriyor?
bazel query path/to/file/bar.java --output=package
path/to/file/bar.java?
için derleme etiketi nedir?
bazel query path/to/file/bar.java
Hangi kural hedeflerinde kaynak olarak path/to/file/bar.java
dosyası bulunur?
fullname=$(bazel query path/to/file/bar.java) bazel query "attr('srcs', $fullname, ${fullname//:*/}:*)"
Hangi paket bağımlılıkları var?
foo
hangi paketlere bağlıdır? (foo
oluşturmak için hangi dalları kontrol etmem gerekiyor?)
bazel query 'buildfiles(deps(//foo:foo))' --output package
foo/contrib
hariç, foo
ağacı hangi paketlere bağlıdır?
bazel query 'deps(foo/... except foo/contrib/...)' --output package
Hangi kural bağımlılıkları var?
Bar hangi genproto kurallarına bağlıdır?
bazel query 'kind(genproto, deps(bar/...))'
Servlet ağacındaki bir Java ikili kuralının geçişli olarak bağlı olduğu bazı JNI (C++) kitaplığının tanımını bulun.
bazel query 'some(kind(cc_.*library, deps(kind(java_binary, //java/com/example/frontend/...))))' --output location
...Şimdi bunlara bağlı tüm Java ikililerinin tanımlarını bulun.
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)'
Hangi dosya bağımlılıkları var?
foo'yu oluşturmak için gereken Java kaynak dosyalarının tamamı nedir?
Kaynak dosyalar:
bazel query 'kind("source file", deps(//path/to/target/foo/...))' | grep java$
Oluşturulan dosyalar:
bazel query 'kind("generated file", deps(//path/to/target/foo/...))' | grep java$
QUX'in testlerini oluşturmak için gereken Java kaynak dosyalarının tamamı nedir?
Kaynak dosyalar:
bazel query 'kind("source file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$
Oluşturulan dosyalar:
bazel query 'kind("generated file", deps(kind(".*_test rule", javatests/com/example/qux/...)))' | grep java$
X ile Y arasındaki bağımlılıklar açısından ne gibi farklılıklar var?
Hangi hedefler //foo
bağlıdır ancak //foo:foolib
bağlı değildir?
bazel query 'deps(//foo) except deps(//foo:foolib)'
foo
testleri, //foo
üretim ikilisinin bağlı olmadığı hangi C++ kitaplıklarına bağlıdır?
bazel query 'kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo))'
Bu bağımlılık neden var?
bar
neden groups2
SDK'sına bağlıdır?
bazel query 'somepath(bar/...,groups2/...:*)'
Bu sorgunun sonuçlarını aldığınızda genellikle tek bir hedefin, bar
için beklenmedik, aşırı ve istenmeyen bir bağımlılık olarak öne çıktığını görürsünüz. Sorgu daha sonra şu şekilde daraltılabilir:
docker/updater:updater_systest
(bir py_test
) öğesinden bağlı olduğu bazı cc_library
öğelerine giden yolu göster:
bazel query 'let cc = kind(cc_library, deps(docker/updater:updater_systest)) in somepath(docker/updater:updater_systest, $cc)'
Neden //photos/frontend:lib
kitaplığı, aynı kitaplığın //third_party/jpeglib
ve //third_party/jpeg
olmak üzere iki varyantına bağlıdır?
Bu sorgu, "Her iki kitaplığa da bağlı olan //photos/frontend:lib
alt grafiğini göster" anlamına gelir. Sonuçlar topolojik sırayla gösterildiğinde, en olası sorunlu öğe en sondaki öğedir.
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
Ne ... bağlıdır?
Y'ye bağlı olan altındaki kurallar nelerdir?
bazel query 'bar/... intersect allpaths(bar/..., Y)'
T'nin paketinde hangi hedefler doğrudan T'ye bağlıdır?
bazel query 'same_pkg_direct_rdeps(T)'
Bağımlılığı nasıl kaldırabilirim?
bar
öğesinin artık X'e bağlı olmaması için hangi bağımlılık yollarını kırmam gerekiyor?
Grafiği svg
dosyasına aktarmak için:
bazel query 'allpaths(bar/...,X)' --output graph | dot -Tsvg > /tmp/dep.svg
Çeşitli
//foo-tests
derlemesinde kaç sıralı adım var?
Sorgu dili şu anda x'ten y'ye en uzun yolu veremiyor ancak başlangıç noktasından en uzak düğümü (veya daha doğrusu bir düğümü) bulabilir ya da x'ten bağlı olduğu her y'ye giden en uzun yolun uzunluklarını gösterebilir. maxrank
kullanma:
bazel query 'deps(//foo-tests)' --output maxrank | tail -1 85 //third_party/zlib:zutil.c
Sonuç, bu derlemede sırayla gerçekleşmesi gereken 85 uzunluğunda yollar olduğunu gösteriyor.