Sorgu kılavuzu

Sorun bildir Kaynağı görüntüleyin Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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şareti ayrıntıları için lütfen Bazel sorgu referansı ve Bazel cquery referansı başlıklı referans kılavuzlarına bakın. Komut satırına bazel help query veya bazel help cquery yazarak yardım alabilirsiniz.

Eksik hedefler gibi hataları yoksayarken bir sorguyu yürütmek için --keep_going işaretini kullanın.

Bir kuralın bağımlılıkları

//foo bağımlıları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

//third_party/zlib:zlibonly kitaplığı, //foo için BUILD dosyasında yer almıyor ancak dolaylı bir bağımlılıktır. Bu bağımlılık yolunu nasıl izleyebiliriz? Burada iki yararlı işlev vardır: allpaths ve somepath. Yalnızca derlediğiniz yapıya dahil olanla ve olası her işle değil, yalnızca oluşturduğunuz yapıya nelerin dahil edildiğiyle ilgileniyorsanız --notool_deps ile araç bağımlılıklarını hariç tutmak isteyebilirsiniz.

Tüm bağımlılıkların grafiğini görselleştirmek için bazel sorgu çıkışını dot komut satırı aracına aktarın:

$ 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şıksa tek bir yola odaklanmak yararlı 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

allpaths ile --output graph 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

Bir kenara: Dolaylı bağımlılıklar

//foo için BUILD dosyası hiçbir zaman //translations/tools:aggregator'a referans vermez. Peki doğrudan bağımlılık nerede?

Belirli kurallar, ek kitaplıklara veya araçlara yönelik gizli bağımlılıklar içerir. Örneğin, bir genproto kuralı oluşturmak için önce Protokol Derleyici'yi oluşturmanız gerekir. Bu nedenle, her genproto kuralı protokol derleyiciye gizli bir bağımlılık taşır. Bu bağımlılıklar derleme dosyasında bahsedilmez, ancak derleme aracı tarafından eklenir. Tüm gizli bağımlılıkların tam listesi şu anda belgelenmemiştir. --noimplicit_deps kullanarak bu bağımlılıkları sorgu sonuçlarından filtreleyebilirsiniz. cquery için bu, çözülmüş araç zincirlerini içerir.

Ters bağımlılıklar

Belirli bir hedefe bağlı hedef grubunu öğrenmek isteyebilirsiniz. Örneğin, bazı kodları değiştirecekseniz hangi diğer kodların çalışmayı durduracağını bilmek isteyebilirsiniz. u'nin geçişli kapatma kümesi içinde x'deki hedeflerin ters bağımlılıklarını bulmak için rdeps(u, x)'ü kullanabilirsiniz.

Bazel'in Sky Query, belirttiğiniz bir evrendeki ters bağımlılıkları sorgulamanızı sağlayan allrdeps işlevini destekler.

Çeşitli kullanım alanları

Birçok bağımlılık ilişkisini analiz etmek için bazel query'ü kullanabilirsiniz.

Var olan ...

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 tarafından hangi dosyalar oluşturulur?

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

starlark makrosu foo tarafından hangi hedefler oluşturulur?

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

//foo oluşturmak için gereken BUILD dosyası grubu nedir?

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

test_suite'ün genişlediği bağımsız testler nelerdir?

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

Bunlardan hangileri C++ testleri?

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

Bunlardan hangisi küçüktür? Orta? 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, bir kalıpla eşleşen testler nelerdir?

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

Kalıp bir normal ifadedir ve kuralın tam adına uygulanır. Bu, tıpkı bir şirket gibi

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 yapı 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ı vardır?

foo hangi paketlere bağlı? (foo derlemek için neleri kontrol etmem gerekiyor?)

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

foo ağacı, foo/contrib hariç hangi paketlere bağlı?

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

Hangi kural bağımlılıkları vardır?

Çubuk hangi genproto kurallarına bağlıdır?

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

Servis ağı ağacında bir Java ikili program kuralı tarafından geçişli olarak kullanılan bir 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 ikili dosyalarının 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ı vardır?

Foo'yu derlemek için gereken Java kaynak dosyaları setinin 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ıklarda ne gibi farklılıklar var?

//foo, //foo:foolib'un bağlı olmadığı hangi hedeflere bağlıdır?

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

foo testleri, //foo üretim ikilisinin kullanmadığı hangi C++ kitaplıklarını kullanıyor?

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

Bu bağımlılık neden var?

bar neden groups2'a bağlıdır?

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

Bu sorgunun sonuçlarını aldıktan sonra, genellikle tek bir hedefin bar için beklenmedik veya ciddi ve istenmeyen bir bağımlılık olarak öne çıktığını görürsünüz. Sorgu daha da ayrıntılı hale getirilerek şu şekilde kullanılabilir:

docker/updater:updater_systest (bir py_test) öğesinden, bağlı olduğu bir cc_library öğesine giden yolu gösterin:

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

//photos/frontend:lib kitaplığı neden aynı kitaplığın iki varyantına (//third_party/jpeglib ve //third_party/jpeg) bağlı?

Bu sorgunun özü şudur: "//photos/frontend:lib için her iki kitaplığa da bağlı olan alt grafiği göster". Topolojik sırada gösterildiğinde, sonucun son öğesi büyük olasılıkla suçludur.

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

Bu duruma bağlı olarak ...

Çubuğun altındaki hangi kurallar Y'ye bağlıdır?

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

T paketindeki hangi hedefler doğrudan T'ye bağlıdır?

bazel query 'same_pkg_direct_rdeps(T)'

Bağımlılığı nasıl kaldırırım?

bar'ün artık X'e bağlı olmaması için hangi bağımlılık yollarını kırmam gerekir?

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'den y'ye giden en uzun yolu size veremiyor ancak başlangıç noktasından en uzak düğümü (veya bir düğümü) bulabilir ya da x'den 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österir.