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.