Bazel Sorgusu Nasıl Yapılır?

Sorun bildirin Kaynağı göster Gece · 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. Web sitemiz g.co/newsinitiative/labs üzerinden bazel help query veya bazel help cquery yazarak komut satırından erişebilirsiniz.

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ılıklarını görmek için Bazel sorgusunda deps işlevi:

$ bazel query "deps(//foo)"
//foo:foo
//foo:foo-dep
...

Bu, //foo oluşturmak için gereken tüm hedefleri içeren kümedir.

İki paket arasındaki bağımlılık zincirini izleme

//third_party/zlib:zlibonly kitaplığı şunun BUILD dosyasında yer almıyor: //foo ama 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ı tüm işler yerine yalnızca oluşturduğunuz yapıya dahil edilenlerle ilgileniyorsanız araç bağımlılıklarını --notool_deps ile 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ına aktarın:

$ bazel query "allpaths(//foo, third_party/...)" --notool_deps --output graph | dot -Tsvg > /tmp/deps.svg

Büyük ve karmaşık olan bir bağımlılık grafiği tek bir yolla 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 öğesini allpaths ile belirtmezseniz bağımlılık grafiğinin düzleştirilmiş bir listesini elde edersiniz.

$ 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 başvuruda bulunmuyor //translations/tools:aggregator. 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'ü oluşturmanız gerekir Derleyici, dolayısıyla her genproto kuralı protokol derleyicidir. Bu bağımlılıklar derleme dosyasında belirtilmemiştir ancak derleme aracı tarafından eklenmiş. Tüm gizli bağımlılıkların tam listesi şu anda belgelenmemiştir. --noimplicit_deps kullanmak, filtreler bu en iyi uygulamaları sorgu sonuçlarınızdan kaldırabilirsiniz. cquery için bu, çözülmüş araç zincirlerini içerir.

Ters bağımlılıklar

Bir hedefe bağlı olan hedef kümesini bilmek isteyebilirsiniz. Örneğin, bir kodu değiştirecekseniz, başka hangi kodda çok az kaldı. Tersini bulmak için rdeps(u, x) kullanabilirsiniz u geçişli kapanışı içinde x bölgesindeki hedeflerin bağımlılıkları.

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

Çeşitli kullanım alanları

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

Mevcut 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:*)'

Hangi hedefler foo Starlark makrosu tarafından oluşturulur?

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

//foo derlemesi için gereken BUILD dosyaları 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,

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

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

bar 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 programları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 derlemek için gereken Java kaynak dosyalarının tam listesi 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ı setinin 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 hangi hedefler //foo:foolib bunlara bağımlı değildir?

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

foo testleri, //foo üretim ikili programının 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 ile ilişkili?

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

Bu sorgunun sonuçlarını aldıktan sonra, çoğu zaman tek bir beklenmedik veya aleni ve istenmeyen bir durum olarak öne çıktığında bar bağımlılığı. Sorgu daha da ayrıntılı hale getirilerek şu şekilde kullanılabilir:

docker/updater:updater_systest (bir py_test) ile cc_library arasında bağımlı olan bir yol 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ı 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, son öğe 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

Bu duruma bağlı olarak ...

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

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

Hangi hedefler T'nin paketinde 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 ürününün artık X'e bağlı kalmaması için hangi bağımlılık yollarını ayı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?

Maalesef sorgu dili şu anda size en uzun yolu sağlayamıyor x'ten y'ye, ancak ondan en uzak olan (veya a) düğümden en uzaktaki düğümü başlangıç noktası veya x ile her bir arasındaki en uzun yolun uzunluklarını gösterebilirsiniz. göre değişir. maxrank hesabını kullan:

bazel query 'deps(//foo-tests)' --output maxrank | tail -1
85 //third_party/zlib:zutil.c

Sonuç, aynı dizede tamamlanması gereken 85 uzunluğunda oluşturmak için kullanılabilir.