Sorgu kılavuzu

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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.