Sorgu kılavuzu

Sorun bildir Kaynağı göster

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ına, Bazel sorgu referansına ve Bazel cquery referansına göz atın. Komut satırına bazel help query veya bazel help cquery yazarak yardım alabilirsiniz.

Eksik hedefler 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 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 derlemek 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 DERLEME dosyasında yer almasa da 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. Olası her iş yerine yalnızca oluşturduğunuz yapıya nelerin dahil olduğunu önemsiyorsanız --notool_deps ile araç bağımlılıklarını hariç tutabilirsiniz.

Tüm bağımlılıkların grafiğini görselleştirmek için Bazel sorgu çıkışını dot komut satırı aracıyla hizalayı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 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

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 yana: örtülü bağımlılıklar

//foo için DERLEME dosyası hiçbir zaman //translations/tools:aggregator değerine referans vermiyor. Peki, doğrudan bağımlılık nerede?

Bazı kurallar, ek kitaplıklara veya araçlara dolaylı bağımlılıklar içerir. Örneğin, genproto kuralı oluşturmak için önce Protokol Derleyici'yi derlemeniz gerekir. Böylece her genproto kuralı, protokol derleyicide dolaylı bir bağımlılık taşır. Bu bağımlılıklar derleme dosyasında değil, derleme aracı tarafından eklenir. Örtülü bağımlılıkların tamamı şu anda belgelenmemiştir. --noimplicit_deps kullanıldığında bu düzeltmeleri sorgu sonuçlarınızdan filtreleyebilirsiniz. Sorgu için bu, çözümlenmiş araç zincirlerini içerir.

Bağımlılıkları tersine çevirme

Bir hedefe bağlı olan hedef kümesini bilmek isteyebilirsiniz. Örneğin, bir kodu değiştirecekseniz kırmak üzere olduğunuz başka bir kodu bilmek isteyebilirsiniz. u konumunun geçişli kapanışında x içindeki hedeflerin ters bağımlılıklarını bulmak için rdeps(u, x) kullanabilirsiniz.

Bazel'in Sky Sorgusu, belirttiğiniz bir evrendeki ters bağımlılıkları sorgulamanıza olanak tanıyan allrdeps işlevini destekler.

Çeşitli kullanımlar

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

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

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

foo yıldız makrosu tarafından hangi hedefler oluşturulur?

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

//foo derlemek için gereken DERLEME dosyası grubu nedir?

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

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

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

Aşağıdakilerden hangileri C++ testidir?

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ındaki 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, tıpkı bir web sitesini

bazel query 'kind(".*_test rule", //foo/...)' | grep -E 'pa?t'

Hangi pakette path/to/file/bar.java dosyası var?

 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 hedefleri kaynak olarak path/to/file/bar.java dosyasını içerir?

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 nelere göz atmam 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/...))'

Servlet ağacındaki Java ikili kuralı tarafından geçişli olarak bağımlı bazı JNI (C++) kitaplıkları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ı vardır?

Foo derlemek 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 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 ve Y arasında bağımlılıklarda ne gibi farklar vardır?

//foo, //foo:foolib hangi hedeflere bağlı değil?

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

foo testleri hangi C++ kitaplıklarının //foo üretim ikili programının bağımlı olmadığı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 hizmetine bağlı?

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

Bu sorgunun sonuçlarını aldığınızda genellikle tek bir hedefin beklenmedik veya korkunç ve istenmeyen bir bar bağımlılığı olarak öne çıkarıldığını fark edersiniz. Sorgu, aşağıdaki ölçütlere göre daha da hassaslaştırılabilir:

docker/updater:updater_systest (bir py_test) noktasından bazı cc_library yoluna bağlı olduğu yolu göster:

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ı //third_party/jpeglib ve //third_party/jpeg kitaplığının iki varyantına bağlı?

Bu sorgu şu şekilde özetlenir: "Her iki kitaplığa da bağlı olan //photos/frontend:lib alt grafiğini göster". Topolojik sırayla gösterildiğinde, sonucun son öğesi en olası nedendir.

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

Şuna bağlıdır:

Çubuğun altındaki hangi kurallar Y'yi temel alır?

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

T paketinde doğrudan T'ye bağımlı olan hedefler hangileridir?

bazel query 'same_pkg_direct_rdeps(T)'

Bağımlılığı nasıl kırabilirim?

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

Grafiğin çıktısını bir svg dosyası olarak almak için:

bazel query 'allpaths(bar/...,X)' --output graph | dot -Tsvg > /tmp/dep.svg

Çeşitli

//foo-tests derlemesinde kaç tane sıralı adım var?

Maalesef sorgu dili şu anda size x'ten y'ye en uzun yolu sunamamaktadır, ancak başlangıç noktasından en uzaktaki (veya daha doğrusu a) düğümü bulabilir ya da x'ten y'ye kadar en uzun yolun uzunluklarını gösterebilir. maxrank özelliğini kullanın:

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 belirtir.