Bazel Sorgu Referansı

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

Bu sayfa, derleme bağımlılıkları analiz etmek için bazel query kullanırken kullanılan Bazel Sorgu Dili için referans kılavuzudur. Ayrıca, bazel query'ün desteklediği çıkış biçimlerini de açıklar.

Pratik kullanım alanları için Bazel Sorgusu Nasıl Kullanılır? başlıklı makaleyi inceleyin.

Ek sorgu referansı

Bazel, yükleme sonrası aşama hedef grafiğinde çalışan query'e ek olarak işlem grafiği sorgusu ve yapılandırılabilir sorguyu içerir.

İşlem grafiği sorgusu

İşlem grafiği sorgusu (aquery), analiz sonrası yapılandırılmış hedef grafikte çalışır ve işlemler, öğeler ve bunların ilişkileri hakkında bilgi gösterir. aquery, yapılandırılmış hedef grafiğinden oluşturulan işlemler/yapıların özellikleriyle ilgilendiğinizde kullanışlıdır. Örneğin, çalıştırılan gerçek komutlar ve bunların girişleri, çıkışları ve akılda kalıcı adları.

Daha ayrıntılı bilgi için sorgu referansı bölümünü inceleyin.

Yapılandırılabilir sorgu

Geleneksel Bazel sorgusu, yükleme sonrası aşama hedef grafiğinde çalışır ve bu nedenle yapılandırma ve ilgili kavramları içermez. Özellikle, select ifadeleri doğru şekilde çözülmez ve bunun yerine seçimlerin tüm olası çözümlerini döndürür. Ancak yapılandırılabilir sorgu ortamı cquery, yapılandırmaları düzgün şekilde yönetir ancak bu orijinal sorgunun tüm işlevlerini sağlamaz.

Daha fazla bilgi için cquery referansı bölümüne bakın.

Örnekler

Kullanıcılar bazel query'ü nasıl kullanıyor? Aşağıda tipik örnekler verilmiştir:

//foo ağacı neden //bar/baz'a bağlı? Yolu gösterme:

somepath(foo/..., //bar/baz:all)

Tüm foo testleri, foo_bin hedefinin kullanmadığı hangi C++ kitaplıklarına bağlı?

kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo:foo_bin))

Jetonlar: Söz dizimi

Sorgu dilindeki ifadeler aşağıdaki jetonlardan oluşur:

  • let gibi anahtar kelimeler. Anahtar kelimeler, dilin ayrılmış kelimeleridir ve her biri aşağıda açıklanmıştır. Anahtar kelimelerin tam listesi şunlardır:

  • "foo/..." veya ".*test rule" ya da "//bar/baz:all" gibi kelimeler. Bir karakter dizisi "tırnak içine alınmışsa" (tek tırnak işareti ' ile başlar ve bitiyorsa veya çift tırnak işareti " ile başlar ve bitiyorsa) kelimedir. Bir karakter dizisi tırnak içine alınmasa bile kelime olarak ayrıştırılabilir. Tırnak içine alınmayan kelimeler, A-Za-z alfabe harfleri, 0-9 rakamları ve */@.-_:$~[] özel karakterlerinden (yıldız, eğik çizgi, yer işareti, nokta, tire, alt çizgi, iki nokta, dolar işareti, yaklaşık işareti, sol köşeli parantez, sağ köşeli parantez) oluşan karakter dizileridir. Ancak göreli hedef adlar bu karakterlerle başlasa da tırnak işareti - veya yıldız işaretiyle * başlayamaz.

    Hedef adlarda bu karakterlere izin verilse de tırnak içine alınmayan kelimeler artı işareti + veya eşittir işareti = karakterlerini içeremez. Sorgu ifadeleri oluşturan kod yazılırken hedef adlar tırnak içine alınmalıdır.

    Kullanıcı tarafından sağlanan değerlerden Bazel sorgu ifadeleri oluşturan komut dosyaları yazarken tırnak içine alma gerekir.

     //foo:bar+wiz    # WRONG: scanned as //foo:bar + wiz.
     //foo:bar=wiz    # WRONG: scanned as //foo:bar = wiz.
     "//foo:bar+wiz"  # OK.
     "//foo:bar=wiz"  # OK.
    

    Bu tırnak işaretlerinin, kabuğunuz tarafından gerekebilecek tırnak işaretlerine ek olduğunu unutmayın. Örneğin:

    bazel query ' "//foo:bar=wiz" '   # single-quotes for shell, double-quotes for Bazel.

    Anahtar kelimeler ve operatörler, tırnak içine alındığında normal kelimeler olarak değerlendirilir. Örneğin, some bir anahtar kelimedir ancak "bazı" bir kelimedir. Hem foo hem de "foo" kelimedir.

    Ancak hedef adlarda tek veya çift tırnak kullanırken dikkatli olun. Bir veya daha fazla hedef adı tırnak içine alırken yalnızca bir tür tırnak işareti kullanın (tüm tırnak işaretleri tek veya çift olmalıdır).

    Java sorgu dizesinin nasıl görüneceğine dair örnekler aşağıda verilmiştir:

      'a"'a'         # WRONG: Error message: unclosed quotation.
      "a'"a"         # WRONG: Error message: unclosed quotation.
      '"a" + 'a''    # WRONG: Error message: unexpected token 'a' after query expression '"a" + '
      "'a' + "a""    # WRONG: Error message: unexpected token 'a' after query expression ''a' + '
      "a'a"          # OK.
      'a"a'          # OK.
      '"a" + "a"'    # OK
      "'a' + 'a'"    # OK
    

    Bu söz dizimi, çoğu durumda tırnak işaretlerine gerek kalmaması için seçilmiştir. (Sıra dışı) ".*test rule" örneğinde tırnak işareti kullanılmalıdır: Noktayla başlar ve boşluk içerir. "cc_library" alanından alıntı yapmak gereksizdir ancak zararsızdır.

  • Parantez (), nokta . ve virgül , gibi noktalama işaretleri. Noktalama işareti içeren kelimeler (yukarıda belirtilen istisnalar dışında) tırnak içine alınmalıdır.

Alıntılanan kelimenin dışındaki boşluk karakterleri yoksayılır.

Bazel sorgu dili kavramları

Bazel sorgu dili, ifade dilidir. Her ifade, kısmi olarak sıralanmış bir hedef grubunu veya eşdeğer olarak bir hedef grafiği (DAG) olarak değerlendirilir. Bu, tek veri türüdür.

Küme ve grafik aynı veri türünü ifade eder ancak bu türün farklı yönlerini vurgular. Örneğin:

  • Set: Hedeflerin kısmi sırası ilgi çekici değildir.
  • Grafi: Hedeflerin kısmi sırası önemlidir.

Bağımlılık grafiğindeki döngüler

Derleme bağımlılık grafikleri döngüsel olmalıdır.

Sorgu dili tarafından kullanılan algoritmalar, döngüsel olmayan grafiklerde kullanılmak üzere tasarlanmıştır ancak döngülere karşı dayanıklıdır. Döngülerin nasıl ele alındığına dair ayrıntılar belirtilmez ve bu ayrıntılara güvenilmemelidir.

Örtük bağımlılıklar

Bazel, BUILD dosyalarında açıkça tanımlanan derleme bağımlılıklarına ek olarak kurallara örtülü bağımlılıklar da ekler. Örneğin, her Java kuralı dolaylı olarak JavaBuilder'a bağlıdır. Örtük bağımlılıklar, $ ile başlayan özellikler kullanılarak oluşturulur ve BUILD dosyalarında geçersiz kılınamaz.

Varsayılan olarak bazel query, sorgu sonucunu hesaplarken gizli bağımlılıkları hesaba katar. Bu davranış, --[no]implicit_deps seçeneğiyle değiştirilebilir. Sorgu yapılandırmaları dikkate almadığı için olası araç zincirlerinin hiçbir zaman dikkate alınmadığını unutmayın.

Sağlamlık

Bazel sorgu dili ifadeleri, tüm BUILD dosyalarındaki tüm kural beyanları tarafından dolaylı olarak tanımlanan grafik olan derleme bağımlılık grafiği üzerinde çalışır. Bu grafiğin biraz soyut olduğunu ve derleme adımlarının tümünün nasıl uygulanacağına dair tam bir açıklama içermediğini anlamak önemlidir. Derleme yapmak için yapılandırma da gereklidir. Daha fazla bilgi için Kullanıcı Kılavuzu'nun yapılandırmalar bölümüne bakın.

Bazel sorgu dilinde bir ifadenin değerlendirilmesinin sonucu tüm yapılandırmalar için doğrudur. Bu, tam olarak doğru olmayıp muhafazakar bir aşırı yaklaşım olabileceği anlamına gelir. Derleme sırasında gereken tüm kaynak dosyaların kümesini hesaplamak için sorgu aracını kullanırsanız sorgu aracı, derlemenizde bu özelliği kullanmayı düşünmeseniz bile mesaj çevirisini desteklemek için gereken tüm dosyaları içereceğinden, aslında gerekenden daha fazla dosya raporlanabilir.

Grafik sırasının korunması hakkında

İşlemler, alt ifadelerinden devralınan tüm sıralama kısıtlamalarını korur. Bunu "kısmi düzenin korunumu yasası" olarak düşünebilirsiniz. Bir örnek verelim: Belirli bir hedefin bağımlılıklarının geçişli kapatmasını belirlemek için bir sorgu gönderirseniz elde edilen küme, bağımlılık grafiğine göre sıralanır. Bu kümeyi yalnızca file türündeki hedefleri içerecek şekilde filtrelerseniz, bu çiftlerin hiçbiri orijinal grafikte doğrudan bağlı olmasa bile, elde edilen alt kümedeki her hedef çifti arasında aynı geçişli kısmi sıralama ilişkisi geçerli olur. (Derleme bağımlılık grafiğinde dosya-dosya kenarı yoktur).

Ancak tüm operatörler sırayı korurken set işlemleri gibi bazı işlemler kendi sıralama kısıtlamalarını getirmez. Şu ifadeyi ele alalım:

deps(x) union y

Nihai sonuç kümesinin sırasının, alt ifadelerinin tüm sıralama kısıtlamalarını koruduğu garanti edilir. Yani x'ün tüm geçişli bağımlılıkları birbirine göre doğru şekilde sıralanır. Ancak sorgu, y'teki hedeflerin sıralaması veya deps(x)'teki hedeflerin y'teki hedeflere göre sıralaması hakkında hiçbir garanti vermez (y'teki ve deps(x)'teki hedeflerin aynı olması durumu hariç).

Sıralama kısıtlamaları getiren operatörler şunlardır: allpaths, deps, rdeps, somepath ve hedef desen joker karakterleri package:*, dir/... vb.

Gökyüzü sorgusu

Gökyüzü Sorgusu, belirtilen bir evren kapsamı üzerinde çalışan bir sorgu modudur.

Yalnızca SkyQuery'de kullanılabilen özel işlevler

Sky Query modunda allrdeps ve rbuildfiles ek sorgu işlevleri bulunur. Bu işlevler, evren kapsamının tamamında çalışır (bu nedenle normal sorgu için anlamlı değildir).

Evreni bir kapsam belirleme

Gökyüzü sorgusu modu, aşağıdaki iki işaretin iletilmesi ile etkinleştirilir: (--universe_scope veya --infer_universe_scope) ve --order_output=no. --universe_scope=<target_pattern1>,...,<target_patternN>, sorguya, hedef kalıplar tarafından belirtilen hedef kalıbın geçişli kapanışını önceden yüklemesini söyler. Bu işlem hem ekleme hem de çıkarmalı olabilir. Ardından tüm sorgular bu "kapsamda" değerlendirilir. Özellikle allrdeps ve rbuildfiles operatörleri yalnızca bu kapsamdaki sonuçları döndürür. --infer_universe_scope, Bazel'e sorgu ifadesinden --universe_scope için bir değer çıkarmasını söyler. Bu türetilmiş değer, sorgu ifadesindeki benzersiz hedef kalıpların listesidir ancak istediğiniz değer bu olmayabilir. Örneğin:

bazel query --infer_universe_scope --order_output=no "allrdeps(//my:target)"

Bu sorgu ifadesindeki benzersiz hedef kalıpların listesi ["//my:target"] olduğundan Bazel bunu çağrıyla aynı şekilde ele alır:

bazel query --universe_scope=//my:target --order_output=no "allrdeps(//my:target)"

Ancak --universe_scope içeren bu sorgunun sonucu yalnızca //my:target'tür. //my:target'un ters bağımlılıklarının hiçbiri yapı gereği evrende yoktur. Diğer yandan, şunu da göz önünde bulundurun:

bazel query --infer_universe_scope --order_output=no "tests(//a/... + b/...) intersect allrdeps(siblings(rbuildfiles(my/starlark/file.bzl)))"

Bu, bazı dizinlerdeki hedeflerin tests genişletmesinde test hedeflerini hesaplamaya çalışan, tanımı belirli bir .bzl dosyası kullanan hedeflere geçişli olarak bağlı olan anlamlı bir sorgu çağrısıdır. Burada --infer_universe_scope, özellikle --infer_universe_scope seçiminin sorgu ifadesini kendinizin ayrıştırmanızı gerektirdiği durumlarda kolaylık sağlar.

Bu nedenle, allrdeps ve rbuildfiles gibi evren kapsamlı operatörlerin kullanıldığı sorgu ifadeleri için --infer_universe_scope'yi yalnızca istediğiniz davranışı sağlıyorsa kullandığınızdan emin olun.

Sky Query, varsayılan sorguya kıyasla bazı avantajlara ve dezavantajlara sahiptir. En büyük dezavantajı, çıktısını grafik sırasına göre sıralayamamasıdır. Bu nedenle belirli çıktı biçimleri yasaktır. Bunun avantajları, varsayılan sorguda kullanılamayan iki operatör (allrdeps ve rbuildfiles) sağlamasıdır. Ayrıca Sky Query, varsayılan uygulamanın yaptığı yeni bir grafik oluşturmak yerine Skyframe grafiğini inceleyerek işini gerçekleştirir. Bu nedenle, daha hızlı ve daha az bellek kullandığı bazı durumlar vardır.

İfadeler: Dil bilgisinin söz dizimi ve semantiği

Bu, Bazel sorgu dilinin EBNF notasyonuyla ifade edilen dil bilgisidir:

expr ::= word
       | let name = expr in expr
       | (expr)
       | expr intersect expr
       | expr ^ expr
       | expr union expr
       | expr + expr
       | expr except expr
       | expr - expr
       | set(word *)
       | word '(' int | word | expr ... ')'

Aşağıdaki bölümlerde, bu dilbilgisindeki üretimlerin her biri sırayla açıklanmaktadır.

Hedef kalıpları

expr ::= word

Söz dizimi açısından, hedef desen yalnızca bir kelimedir. Bir dizi (sıralanmamış) hedef olarak yorumlanır. En basit hedef kalıbı, tek bir hedefi (dosya veya kural) tanımlayan bir etikettir. Örneğin, //foo:bar hedef kalıbı bir öğe, hedef ve bar kuralını içeren bir küme olarak değerlendirilir.

Hedef kalıpları, paketler ve hedefler yerine joker karakterleri içerecek şekilde etiketleri genelleştirir. Örneğin, foo/...:all (veya yalnızca foo/...), foo dizininin altında bulunan her paketteki tüm kuralları yinelemeli olarak içeren bir küme olarak değerlendirilen bir hedef kalıptır. bar/baz:all, bar/baz paketindeki tüm kuralları içeren ancak alt paketlerini içermeyen bir küme olarak değerlendiren bir hedef kalıptır.

Benzer şekilde foo/...:*, foo dizininin altındaki her pakette bulunan tüm hedefleri (kural ve dosyaları) içeren bir küme olarak değerlendirilen bir hedef kalıbıdır; bar/baz:* ise bar/baz paketindeki tüm hedefleri (alt paketleri hariç) içeren bir küme olarak değerlendirilir.

:* joker karakteri, kuralların yanı sıra dosyalarla da eşleştiğinden genellikle sorgular için :all'ten daha kullanışlıdır. Buna karşılık, :all joker karakteri (foo/... gibi hedef kalıplarda varsayılan olarak bulunur) genellikle derlemeler için daha kullanışlıdır.

bazel query hedef kalıpları, bazel build derleme hedeflerinin çalışmalarıyla aynı şekilde çalışır. Daha ayrıntılı bilgi için Hedef Kalıplar'a bakın veya bazel help target-syntax yazın.

Hedef kalıplar, tek öğeli bir küme (etiket durumunda), çok sayıda öğe içeren bir küme (binlerce öğe içeren foo/... durumunda olduğu gibi) veya hedef kalıp hiçbir hedefle eşleşmezse boş küme olarak değerlendirilebilir.

Hedef kalıp ifadesinin sonucundaki tüm düğümler, bağımlılık ilişkisine göre birbirine göre doğru şekilde sıralanır. Yani foo:* sonucunun sonucu yalnızca foo paketindeki hedef kümesi değildir, aynı zamanda bu hedeflerin üzerindeki grafiktir. (Sonuç düğümlerinin diğer düğümlere göre göreli sıralaması hakkında herhangi bir garanti verilmez.) Daha fazla bilgi için grafik sırası bölümüne bakın.

Değişkenler

expr ::= let name = expr1 in expr2
       | $name

Bazel sorgu dili, değişkenlerin tanımlanmasına ve değişkenlere referans verilmesine olanak tanır. Bir let ifadesinin değerlendirilmesinin sonucu, expr2 ifadesinin sonuçlarıyla aynıdır. name değişkeninin tüm ücretsiz tekrarları, expr1 değeriyle değiştirilir.

Örneğin, let v = foo/... in allpaths($v, //common) intersect $v, allpaths(foo/...,//common) intersect foo/... ile eşdeğerdir.

name değişken referansının, kapsayıcı let name = ... ifadesi dışında kullanılması hatadır. Diğer bir deyişle, üst düzey sorgu ifadelerinde serbest değişkenler bulunamaz.

Yukarıdaki dil bilgisi üretimlerinde name, kelime gibidir ancak C programlama dilinde yasal bir tanımlayıcı olması ek kısıtlamayla yapılır. Değişken referanslarının başına "$" karakteri eklenmelidir.

Her let ifadesi yalnızca tek bir değişken tanımlar ancak bunları iç içe yerleştirebilirsiniz.

Hem hedef kalıplar hem de değişken referansları yalnızca tek bir jetondan (kelime) oluştuğu için söz dizimi belirsizliği oluşturur. Ancak, yasal değişken adları olan kelime alt kümesi, yasal hedef kalıpları olan kelime alt kümesinden ayrı olduğundan anlamsal belirsizlik yoktur.

Teknik açıdan bakıldığında let ifadeleri, sorgu dilinin ifade gücünü artırmaz: Bir dilde ifade edilebilen herhangi bir sorgu, söz konusu dil kullanılmadan da ifade edilebilir. Ancak bu işlevler, birçok sorgunun kısalığını iyileştirir ve daha verimli sorgu değerlendirmesine yol açabilir.

Parantez içine alınmış ifadeler

expr ::= (expr)

Parantezler, bir değerlendirme sırası uygulamak için alt ifadeleri ilişkilendirir. Parantez içindeki bir ifade, bağımsız değişkeninin değerini değerlendirir.

Cebirsel küme işlemleri: kesişim, birleştirme, küme farkı

expr ::= expr intersect expr
       | expr ^ expr
       | expr union expr
       | expr + expr
       | expr except expr
       | expr - expr

Bu üç operatör, bağımsız değişkenleri üzerinde normal küme işlemlerini hesaplar. Her operatörün iki biçimi vardır: intersect gibi nominal form ve ^ gibi sembolik form. Her iki biçim de eşdeğerdir. Sembolik biçimlerin yazılması daha hızlıdır. (Daha net bir ifadeyle, bu sayfanın geri kalanında nominal formlar kullanılmaktadır.)

Örneğin,

foo/... except foo/bar/...

foo/... ile eşleşen ancak foo/bar/... ile eşleşmeyen hedef kümesini döndürür.

Aynı sorguyu şu şekilde yazabilirsiniz:

foo/... - foo/bar/...

intersect (^) ve union (+) işlemleri değişmeli (simetrik) olup except (-) asimetriktir. Ayrıştırıcı, üç operatörü de sol-ilişkili ve eşit öncelikli olarak ele aldığından parantez isteyebilirsiniz. Örneğin, bu ifadelerin ilk ikisi eşdeğerdir ancak üçüncüsü değildir:

x intersect y union z
(x intersect y) union z
x intersect (y union z)

Harici bir kaynaktan hedefleri okuma: ayarlandı

expr ::= set(word *)

set(a b c ...) operatörü, boşlukla (virgül olmadan) ayrılmış sıfır veya daha fazla hedef kalıptan oluşan bir grubun birleşimini hesaplar.

Bourne kabuğunun $(...) özelliğiyle birlikte set(), bir sorgunun sonuçlarını normal bir metin dosyasına kaydetme, bu metin dosyasını diğer programlar (standart UNIX kabuk araçları gibi) kullanarak değiştirme ve ardından sonucu daha fazla işleme için bir değer olarak sorgu aracına geri getirme olanağı sağlar. Örneğin:

bazel query deps(//my:target) --output=label | grep ... | sed ... | awk ... > foo
bazel query "kind(cc_binary, set($(<foo)))"

Aşağıdaki örnekte, kind(cc_library, deps(//some_dir/foo:main, 5)), awk programı kullanılarak maxrank değerlerine göre filtrelenerek hesaplanır.

bazel query 'deps(//some_dir/foo:main)' --output maxrank | awk '($1 < 5) { print $2;} ' > foo
bazel query "kind(cc_library, set($(<foo)))"

Bu örneklerde $(<foo), $(cat foo) ifadesinin kısaltmasıdır ancak önceki awk komutu gibi cat dışındaki kabuk komutları da kullanılabilir.

İşlevler

expr ::= word '(' int | word | expr ... ')'

Sorgu dili çeşitli işlevler tanımlar. İşlevin adı, gerektirdiği bağımsız değişkenlerin sayısını ve türünü belirler. Aşağıdaki işlevler kullanılabilir:

Bağımlılıkları geçici olarak kapatma: bağımlılıklar

expr ::= deps(expr)
       | deps(expr, depth)

deps(x) operatörü, bağımsız değişken kümesi x'ün bağımlılıkları için geçişli kapatma işlemiyle oluşturulan grafiği değerlendirir. Örneğin, deps(//foo) değerinin tüm bağımlılıkları dahil olmak üzere tek bir düğüm foo'de köklenen bağımlılık grafiğidir. deps(foo/...) değeri, kökleri foo dizininin altındaki her pakette bulunan tüm kurallar olan bağımlılık grafikleridir. Bu bağlamda "bağımlılıklar" yalnızca kural ve dosya hedefleri anlamına gelir. Bu nedenle, bu hedefleri oluşturmak için gereken BUILD ve Starlark dosyaları buraya dahil edilmez. Bunun için buildfiles operatörünü kullanmanız gerekir.

Ortaya çıkan grafik, bağımlılık ilişkisine göre sıralanır. Daha fazla ayrıntı için grafik sırası bölümüne bakın.

deps operatörü, isteğe bağlı ikinci bir bağımsız değişken kabul eder. Bu bağımsız değişken, aramanın derinliği için üst sınırı belirten bir tam sayı değişmez ifadesidir. Bu nedenle deps(foo:*, 0), foo paketindeki tüm hedefleri döndürür. deps(foo:*, 1) ise foo paketindeki herhangi bir hedefin doğrudan ön koşullarını içerir. deps(foo:*, 2) ise deps(foo:*, 1)'deki düğümlerden doğrudan erişilebilen düğümleri içerir ve bu böyle devam eder. (Bu sayılar, minrank çıkış biçiminde gösterilen sıralamalara karşılık gelir.) depth parametresi atlanırsa arama sınırsızdır: ön koşulların yansıtmalı geçişli kapatmasını hesaplar.

Ters bağımlılıkların geçişli kapatması: rdeps

expr ::= rdeps(expr, expr)
       | rdeps(expr, expr, depth)

rdeps(u, x) operatörü, u evren kümesinin geçişli kapatma kümesi içinde x bağımsız değişken kümesinin ters bağımlılıkları olarak değerlendirilir.

Elde edilen grafik, bağımlılık ilişkisine göre sıralanır. Daha fazla bilgi için grafik sırası bölümüne bakın.

rdeps operatörü, isteğe bağlı bir üçüncü bağımsız değişkeni kabul eder. Bu bağımsız değişken, aramanın derinliği için bir üst sınır belirten bir tam sayı değişmez ifadesidir. Elde edilen grafik yalnızca bağımsız değişken grubundaki herhangi bir düğümden belirtilen derinlikteki mesafedeki düğümleri içerir. Dolayısıyla rdeps(//foo, //common, 1), //foo'un geçişli kapatmasında doğrudan //common'ye bağlı olan tüm düğümler olarak değerlendirilir. (Bu sayılar, minrank çıkış biçiminde gösterilen sıralamalara karşılık gelir.) depth parametresi atlanırsa arama sınırsızdır.

Tüm ters bağımlılıkların geçici olarak kapatılması: allrdeps

expr ::= allrdeps(expr)
       | allrdeps(expr, depth)
ile kullanılabilir

allrdeps operatörü, rdeps operatörü gibi davranır. Tek fark "evren grubu"nun ayrı olarak belirtilmeyip --universe_scope işaretinin değerlendirildiği değer olmasıdır. Bu nedenle, --universe_scope=//foo/... iletildiyse allrdeps(//bar), rdeps(//foo/..., //bar) ile eşdeğerdir.

Aynı paketteki doğrudan ters bağımlılıklar: same_pkg_direct_rdeps

expr ::= same_pkg_direct_rdeps(expr)

same_pkg_direct_rdeps(x) operatörü, bağımsız değişken grubundaki bir hedef olarak aynı pakette olan ve doğrudan ona bağlı olan hedef kümesinin tamamını değerlendirir.

Hedefin paketiyle ilgili işlem yapma: Kardeşler

expr ::= siblings(expr)

siblings(x) operatörü, bağımsız değişken grubundaki bir hedefle aynı pakette bulunan tüm hedef grubunu değerlendirir.

Rastgele seçim: bazı

expr ::= some(expr)
       | some(expr, count )

some(x, k) operatörü, x bağımsız değişkeni grubundan en fazla k hedefi rastgele seçer ve yalnızca bu hedefleri içeren bir küme olarak değerlendirilir. k parametresi isteğe bağlıdır; eksikse sonuç, rastgele seçilen yalnızca bir hedef içeren tek bir küme olur. x bağımsız değişken grubunun boyutu k değerinden küçükse x bağımsız değişken kümesinin tamamı döndürülür.

Örneğin, some(//foo:main union //bar:baz) ifadesi //foo:main veya //bar:baz değerini içeren tek öğeli bir küme olarak değerlendirilir. Ancak hangi değer olduğu tanımlanmaz. some(//foo:main union //bar:baz, 2) veya some(//foo:main union //bar:baz, 3) ifadesi hem //foo:main hem de //bar:baz değerini döndürür.

Bağımsız değişken tekil ise some, kimlik işlevini hesaplar: some(//foo:main), //foo:main ile eşdeğerdir.

some(//foo:main intersect //bar:baz) ifadesinde olduğu gibi, belirtilen bağımsız değişken grubu boşsa bu bir hatadır.

Yol operatörleri: somepath, allpaths

expr ::= somepath(expr, expr)
       | allpaths(expr, expr)

somepath(S, E) ve allpaths(S, E) operatörleri, iki hedef grubu arasındaki yolları hesaplar. Her iki sorgu da iki bağımsız değişkeni kabul eder: bir başlangıç noktası S grubu ve bir bitiş noktası E grubu. somepath, S'daki bir hedeften E'daki bir hedefe giden belirli bir yoldaki düğümlerin grafiğini döndürür; allpaths ise S'daki herhangi bir hedeften E'daki herhangi bir hedefe giden tüm yollardaki düğümlerin grafiğini döndürür.

Elde edilen grafikler, bağımlılık ilişkisine göre sıralanır. Daha ayrıntılı bilgi için grafik sırası ile ilgili bölüme bakın.

Biryol
somepath(S1 + S2, E), bir olası sonuç.
Biryol
somepath(S1 + S2, E), başka bir olası sonuç.
Allpaths
allpaths(S1 + S2, E)

Hedef tür filtreleme: tür

expr ::= kind(word, expr)

kind(pattern, input) operatörü, bir hedef grubuna filtre uygular ve beklenen türde olmayan hedefleri atar. pattern parametresi, eşlenecek hedefin türünü belirtir.

Örneğin, aşağıda gösterilen BUILD dosyası (p paketi için) tarafından tanımlanan dört hedefin türleri tabloda gösterilmektedir:

Kod Hedef Tür
        genrule(
            name = "a",
            srcs = ["a.in"],
            outs = ["a.out"],
            cmd = "...",
        )
      
//p:a genrule kuralı
//p:a.in kaynak dosya
//p:a.out oluşturulan dosya
//p:BUILD kaynak dosya

Bu nedenle, kind("cc_.* rule", foo/...), foo altındaki tüm cc_library, cc_binary vb. kural hedeflerinin kümesini, kind("source file", deps(//foo)) ise //foo hedefinin bağımlılıkların geçişli kapatma kümesinde bulunan tüm kaynak dosyalarının kümesini değerlendirir.

pattern bağımsız değişkeninin tırnak işareti kullanımı, bu bağımsız değişkenin ayrıştırıcı tarafından kelime olarak kabul edilmediği source file ve .*_test gibi birçok normal ifade olmadığı için çoğu zaman gereklidir.

package group ile eşleştirme yaparken :all ile biten hedefler hiçbir sonuç vermeyebilir. Bunun yerine :all-targets politikasını kullanın.

Hedef adı filtreleme: filtre

expr ::= filter(word, expr)

filter(pattern, input) operatörü, bir hedef grubuna filtre uygular ve etiketleri (mutlak biçimde) kalıpla eşleşmeyen hedefleri atar. Bu operatör, girişinin bir alt kümesi olarak değerlendirilir.

Birinci bağımsız değişken olan pattern, hedef adlar üzerinde normal ifade içeren bir kelimedir. Bir filter ifadesi, tüm x hedeflerini içeren küme olarak değerlendirilir. Burada, x input kümesinin üyesi olur ve x etiketinin etiketi (//foo:bar gibi mutlak biçimde) pattern normal ifadesi için (bağlanmamış) bir eşleşme içerir. Tüm hedef adları // ile başladığından ^ normal ifadesi bağlayıcısına alternatif olarak kullanılabilir.

Bu operatör genellikle intersect operatörüne kıyasla çok daha hızlı ve daha güçlü bir alternatif sunar. Örneğin, //foo:foo hedefinin tüm bar bağımlılıkları görmek için şunu değerlendirebilirsiniz:

deps(//foo) intersect //bar/...

Ancak bu ifade, bar ağacındaki tüm BUILD dosyalarının ayrıştırılmasını gerektirir. Bu işlem yavaş olur ve alakasız BUILD dosyalarında hatalara yol açabilir. Bir alternatif şöyle olabilir:

filter(//bar, deps(//foo))

Bu işlev, önce //foo bağımlılıklarını hesaplar ve ardından yalnızca sağlanan kalıpla eşleşen hedefleri (yani adlarında alt dize olarak //bar içeren hedefleri) filtreler.

filter(pattern, expr) operatörünün yaygın olarak kullanılan bir diğer işlevi, belirli dosyaları adlarına veya uzantılarına göre filtrelemektir. Örneğin,

filter("\.cc$", deps(//foo))

//foo derlemek için kullanılan tüm .cc dosyalarının listesini sağlar.

Kural özelliği filtreleme: attr

expr ::= attr(word, word, expr)

attr(name, pattern, input) operatörü, bir hedef grubuna filtre uygular ve kural olmayan hedefleri, name özelliği tanımlanmamış kural hedeflerini veya özellik değerinin sağlanan normal ifadeyle pattern eşleşmediği kural hedeflerini atar; girişinin bir alt kümesini değerlendirir.

İlk bağımsız değişken olan name, sağlanan normal ifade kalıbıyla eşleştirilmesi gereken kural özelliğinin adıdır. İkinci bağımsız değişken pattern, özellik değerleri için bir düzenli ifadedir. Bir attr ifadesi, x input kümesinin bir üyesi olacak şekilde tüm x hedeflerini içeren küme olarak değerlendirilir. Bu ifade, tanımlanmış name özelliğine sahip bir kuraldır ve özellik değeri, pattern normal ifadesiyle bir (sabitlenmemiş) eşleşme içerir. name isteğe bağlı bir özellikse ve kuralda açıkça belirtilmezse karşılaştırma için varsayılan özellik değeri kullanılır. Örneğin,

attr(linkshared, 0, deps(//foo))

linkshared özelliğine sahip olmasına izin verilen tüm //foo bağımlılıkları (cc_binary kuralı gibi) seçer ve bu özelliği açıkça 0 olarak ayarlar veya hiç ayarlamaz ancak varsayılan değer 0 olur (cc_binary kuralları için olduğu gibi).

Liste türündeki özellikler (ör. srcs, data vb.), [ parantezle başlayıp ] parantezle biten ve birden fazla değeri sınırlamak için "," (virgül, boşluk) kullanılarak [value<sub>1</sub>, ..., value<sub>n</sub>] biçimindeki dizelere dönüştürülür. Etiketler, etiketin mutlak biçimi kullanılarak dizelere dönüştürülür. Örneğin, deps=[":foo", "//otherpkg:bar", "wiz"] özelliği [//thispkg:foo, //otherpkg:bar, //thispkg:wiz] dize dönüştürülür. Köşeli parantezler her zaman mevcuttur. Bu nedenle, boş listede eşleştirme amacıyla [] dize değeri kullanılır. Örneğin,

attr("srcs", "\[\]", deps(//foo))

//foo bağımlılıkları arasında boş srcs özelliğine sahip tüm kuralları seçerken

attr("data", ".{3,}", deps(//foo))

//foo bağımlılıkları arasından data özelliğinde en az bir değer belirten tüm kuralları seçer (// ve : nedeniyle her etiket en az 3 karakter uzunluğundadır).

Liste türü özelliğinde belirli bir value içeren //foo bağımlılıkları arasındaki tüm kuralları seçmek için şunu kullanın:

attr("tags", "[\[ ]value[,\]]", deps(//foo))

Bu, value karakterinden önceki karakterin [ veya boşluk, value karakterinden sonraki karakterin ise virgül veya ] olması nedeniyle işe yarar.

Kural görünürlüğü filtreleme: görünür

expr ::= visible(expr, expr)

visible(predicate, input) operatörü, bir dizi hedefe filtre uygular ve gerekli görünürlüğe sahip olmayan hedefleri siler.

İlk bağımsız değişken (predicate), çıktıdaki tüm hedeflerin görebileceği bir hedef grubudur. Bir visible ifadesi, x input kümesinin bir üyesi olacak şekilde tüm x hedeflerini içeren küme olarak değerlendirilir ve predicate içindeki tüm y hedefleri için x, y tarafından görülebilir. Örneğin:

visible(//foo, //bar:*)

//bar paketindeki //foo'ın görünürlük kısıtlamalarını ihlal etmeden bağımlı olabileceği tüm hedefleri seçer.

Etiket türündeki kural özelliklerinin değerlendirilmesi: etiketler

expr ::= labels(word, expr)

labels(attr_name, inputs) operatörü, inputs kümesindeki bir kuralda "etiket" veya "etiket listesi" türündeki attr_name özelliğinde belirtilen hedef grubunu döndürür.

Örneğin labels(srcs, //foo), //foo kuralının srcs özelliğinde görünen hedef grubunu döndürür. inputs grubunda srcs özelliklerine sahip birden fazla kural varsa srcs özelliklerinin birleşimi döndürülür.

test_suites: testleri genişletip filtrele

expr ::= tests(expr)

tests(x) operatörü, x grubundaki tüm test kurallarının grubunu döndürür, tüm test_suite kurallarını atıfta bulundukları bağımsız testler grubuna genişletir ve tag ve size'e göre filtreleme uygular.

Sorgu değerlendirmesi varsayılan olarak tüm test_suite kurallarındaki test dışı hedefleri yoksayar. Bu, --strict_test_suite seçeneğiyle hata olarak değiştirilebilir.

Örneğin, kind(test, foo:*) sorgusu foo paketindeki tüm *_test ve test_suite kurallarını listeler. Tüm sonuçlar (tanım gereği) foo paketinin üyeleridir. Buna karşılık, tests(foo:*) sorgusu bazel test foo:* tarafından yürütülecek tüm bağımsız testleri döndürür: Bu, test_suite kuralları aracılığıyla doğrudan veya dolaylı olarak referans verilen, diğer paketlere ait testleri içerebilir.

Paket tanımı dosyaları: buildfiles

expr ::= buildfiles(expr)

buildfiles(x) operatörü, x kümesinde her bir hedefin paketlerini tanımlayan dosya kümesini döndürür. Diğer bir deyişle, her paket için BUILD dosyası ve load aracılığıyla referans verdiği tüm .bzl dosyaları döndürülür. Bu işlemin, loaded dosyaları içeren paketlerin BUILD dosyalarını da döndürdüğünü unutmayın.

Bu operatör genellikle, belirli bir hedefi oluşturmak için hangi dosyaların veya paketlerin gerekli olduğunu belirlerken kullanılır (genellikle aşağıdaki --output package seçeneğiyle birlikte). Örneğin,

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

//foo'nin geçişli olarak bağlı olduğu tüm paketlerin kümesini döndürür.

Paket tanımı dosyaları: rbuildfiles

expr ::= rbuildfiles(word, ...)

rbuildfiles operatörü, virgülle ayrılmış bir yol parçası listesi alır ve bu yol parçalarına geçişli olarak bağlı olan BUILD dosyası grubunu döndürür. Örneğin, //foo bir paketse rbuildfiles(foo/BUILD), //foo:BUILD hedefini döndürür. foo/BUILD dosyasında load('//bar:file.bzl'... varsa rbuildfiles(bar/file.bzl), //foo:BUILD hedefini ve //bar:file.bzl yükleyen diğer tüm BUILD dosyalarının hedeflerini döndürür.

rbuildfiles operatörünün kapsamı, --universe_scope işaretçisi tarafından belirtilen evrendir. Doğrudan BUILD dosyalarına ve .bzl dosyalarına karşılık gelmeyen dosyalar sonuçları etkilemez. Örneğin, BUILD dosyasında açıkça belirtilmiş olsalar bile kaynak dosyalar (foo.cc gibi) yoksayılır. Ancak simge bağlantılarına saygı duyulur. Bu nedenle, foo/BUILD bar/BUILD'a giden bir simge bağlantısıysa rbuildfiles(bar/BUILD), sonuçlarına //foo:BUILD'ı ekler.

rbuildfiles operatörü, buildfiles operatörünün neredeyse ahlaki olarak tersidir. Bununla birlikte, bu ahlaki tersine dönüşüm tek bir yönde daha güçlü bir duruşa sahiptir: rbuildfiles çıktıları buildfiles girişlerine benzer. İlki, paketlerde yalnızca BUILD dosya hedeflerini içerir ve ikincisi, bu tür hedefleri içerebilir. Diğer yönde ise bu ilişki daha zayıftır. buildfiles operatörünün çıkışları, tüm paketlere ve .bzl Belirli bir giriş için gereken dosyalar. Ancak rbuildfiles operatörünün girişleri bu hedefler değil, bu hedeflere karşılık gelen yol parçalarıdır.

Paket tanımı dosyaları: loadfiles

expr ::= loadfiles(expr)

loadfiles(x) operatörü, x kümesinde her hedefin paketlerini yüklemek için gereken Starlark dosyalarını döndürür. Diğer bir deyişle, her paket için BUILD dosyalarından referans verilen .bzl dosyalarını döndürür.

Çıkış biçimleri

bazel query bir grafik oluşturur. bazel query'ın bu grafiği --output komut satırı seçeneğiyle nasıl sunacağını, içeriği, biçimi ve sıralamayı belirtirsiniz.

Sky Query ile çalıştırıldığında yalnızca sırasız çıkışla uyumlu çıkış biçimlerine izin verilir. Özellikle, graph, minrank ve maxrank çıkış biçimleri yasaktır.

Çıkış biçimlerinden bazıları ek seçenekleri kabul eder. Her çıkış seçeneğinin adının önüne, geçerli olduğu çıkış biçimi eklenir. Dolayısıyla --graph:factored, yalnızca --output=graph kullanıldığında uygulanır. graph dışında bir çıkış biçimi kullanılırsa etkisi olmaz. Benzer şekilde, --xml:line_numbers yalnızca --output=xml kullanılırken geçerlidir.

Sonuçların sıralaması

Sorgu ifadeleri her zaman "grafik sırasının korunması yasası"na uysa da sonuçların sunulması, bağımlılık sırasına göre veya sırasız olarak yapılabilir. Bu durum, sonuç kümesindeki hedefleri veya sorgunun nasıl hesaplanacağını etkilemez. Yalnızca sonuçların stdout'a yazdırılma şeklini etkiler. Ayrıca, bağımlılık sırasında eşdeğer olan düğümler alfabetik olarak sıralanabilir veya sıralanmayabilir. Bu davranışı kontrol etmek için --order_output işareti kullanılabilir. (--[no]order_results işareti, --order_output işaretinin işlevlerinin bir alt kümesini içerir ve desteği sonlandırılmıştır.)

Bu işaretin varsayılan değeri auto'tür. Bu değer, sonuçları alfabetik sırayla yazdırır. Ancak somepath(a,b) kullanıldığında, sonuçlar bunun yerine deps sırasına göre yazdırılır.

Bu işaret no olduğunda ve --output build, label, label_kind, location, package, proto veya xml arasından biri olduğunda çıkışlar rastgele sırayla yazdırılır. Bu genellikle en hızlı seçenektir. Ancak --output, graph, minrank veya maxrank arasından biri olduğunda desteklenmez: Bu biçimlerde Bazel, sonuçları her zaman bağımlılık sırasına veya sıralamaya göre yazdırır.

Bu işaret deps olduğunda Bazel, sonuçları topolojik bir sırada (yani önce bağımlılıklar) yazdırır. Ancak bağımlılık sırasına göre sıralandırılmayan düğümler (birinden diğerine yol olmadığı için) herhangi bir sırada basılabilir.

Bu işaret full olduğunda Bazel, düğümleri tamamen deterministik (toplam) sırayla yazdırır. Öncelikle tüm düğümler alfabetik olarak sıralanır. Ardından, listedeki her düğüm, ziyaret edilmeyen düğümlere giden giden kenarların, halef düğümlerin alfabetik sırasına göre taranacağı bir sondan önce derinlik aramasının başlangıcı olarak kullanılır. Son olarak, düğümler ziyaret edildikleri sıranın tersine göre yazdırılır.

Nodları bu sırayla yazdırmak daha yavaş olabilir. Bu nedenle, yalnızca determinizm önemli olduğunda kullanılmalıdır.

Hedeflerin kaynak formunu BUILD'de göründüğü şekilde yazdırın

--output build

Bu seçenekte, her hedefin temsili BUILD dilinde elle yazılmış gibidir. Tüm değişkenler ve işlev çağrıları (ör. glob, makrolar) genişletilir. Bu, Starlark makrolarının etkisini görmek için yararlıdır. Ayrıca her etkili kural, etkili kuralı oluşturmak için değerlendirilen makronun adını vererek bir generator_name ve/veya generator_function değeri bildirir.

Çıktı, BUILD dosyalarıyla aynı söz dizimini kullansa da geçerli bir BUILD dosyası oluşturması garanti edilmez.

--output label

Bu seçenekle, elde edilen grafikteki her hedefin ad grubu (veya etiketleri), satır başına bir etiket olacak şekilde topolojik sırada yazdırılır (--noorder_results belirtilmediği sürece sonuçların sıralanmasıyla ilgili notlara bakın). (Topolojik sıralamada, bir grafik düğümünün haleflerinden daha erken görünmesi gerekir.) Elbette bir grafiğin birçok topolojik sıralaması vardır (ters sondan önce bunlardan yalnızca biridir). Hangisinin seçildiği belirtilmez.

somepath sorgusunun çıkışını yazdırırken düğümlerin yazdırılma sırası, yolun sırasıdır.

Uyarı: Bazı uç durumlarda, aynı etikete sahip iki farklı hedef olabilir. Örneğin, bir sh_binary kuralı ve tek (dolaylı) srcs dosyası foo.sh olarak adlandırılabilir. Bir sorgunun sonucu bu hedeflerin ikisini de içeriyorsa çıkış (label biçiminde) yinelenen bir değer içermiş gibi görünür. label_kind (aşağıya bakın) biçimi kullanıldığında bu fark net bir şekilde anlaşılır: İki hedefin adı aynıdır ancak birinin türü sh_binary rule, diğerinin türü source file'dir.

--output label_kind

label gibi bu çıkış biçimi de sonuçta elde edilen grafikteki her hedefin etiketlerini topolojik sırayla yazdırır ancak etiketten önce hedefin türünü de ekler.

--output proto

Sorgu çıkışını QueryResult protokol arabelleği olarak yazdırır.

--output streamed_proto

Target protokol arabelleklerinden oluşan uzunlukla sınırlanmış bir akış yazdırır. Bu, (i) tek bir QueryResult'e sığmayacak kadar çok hedef olduğunda protokol arabelleklerinin boyut sınırlamalarını aşmak veya (ii) Bazel hâlâ çıkış verirken işlemeyi başlatmak için kullanışlıdır.

--output textproto

--output proto'e benzer şekilde, QueryResult protokol arabelleğini metin biçiminde yazdırır.

--output streamed_jsonproto

--output streamed_proto'e benzer şekilde, Target protokol arabelleklerinin akışını ndjson biçiminde yazdırır.

--output minrank --output maxrank

label gibi minrank ve maxrank çıkış biçimleri de elde edilen grafikte her hedefin etiketlerini yazdırır ancak bu etiketler topolojik sırayla değil, sıra numaralarının önüne eklenerek sıra sıra gösterilir. Bunlar, sonuç sıralama --[no]order_results işaretinden etkilenmez (sonuçların sıralanmasıyla ilgili notlara bakın).

Bu biçimin iki varyantı vardır: minrank her düğümü bir kök düğümden kendisine giden en kısa yolun uzunluğuna göre sıralar. "Kök" düğümler (gelen kenarı olmayanlar) 0. sıradadır, halefleri 1. sıradadır vb. (Kenarlar her zaman bir hedeften ön koşullarına, yani bağlı olduğu hedeflere işaret eder.)

maxrank, her düğümü bir kök düğümden kendisine giden en uzun yolun uzunluğuna göre sıralar. Yine, "kökler" 0 sırasına sahiptir, diğer tüm düğümler ise önceki tüm düğümlerin maksimum sırasından bir fazla sıraya sahiptir.

Bir döngüdeki tüm düğümler eşit rütbeye sahiptir. (Çoğu grafik döngüsel değildir ancak döngüler, BUILD dosyalarında hatalı döngüler bulunduğu için oluşur.)

Bu çıkış biçimleri, bir grafiğin ne kadar derin olduğunu keşfetmek için kullanışlıdır. deps(x), rdeps(x) veya allpaths sorgusunun sonucu için kullanılırsa sıra numarası, x'ten bu sıradaki bir düğüme giden en kısa (minrank ile) veya en uzun (maxrank ile) yolun uzunluğuna eşittir. maxrank, bir hedef oluşturmak için gereken en uzun oluşturma adımları dizisini belirlemek amacıyla kullanılabilir.

Örneğin, soldaki grafikte sırasıyla --output minrank ve --output maxrank belirtildiğinde sağdaki çıkışlar elde edilir.

Sıralama dışı
      minrank

      0 //c:c
      1 //b:b
      1 //a:a
      2 //b:b.cc
      2 //a:a.cc
      
      maxrank

      0 //c:c
      1 //b:b
      2 //a:a
      2 //b:b.cc
      3 //a:a.cc
      
--output location

label_kind gibi bu seçenek de sonuçtaki her bir hedef için hedefin türünü ve etiketini yazdırır. Ancak bu seçenek, hedefin konumunu dosya adı ve satır numarası olarak açıklayan bir dizeyle öne çıkarılır. Biçim, grep işlevinin çıktısına benzer. Bu nedenle, ikincisini ayrıştırabilen araçlar (Emacs veya vi gibi), bir dizi eşleşmede ilerlemek için sorgu çıkışını da kullanabilir. Bu sayede Bazel sorgu aracı, bağımlılık grafiğine duyarlı bir "BUILD dosyaları için grep" olarak kullanılabilir.

Konum bilgileri, hedef türüne göre değişiklik gösterir (tür operatörüne bakın). Kurallar için, kuralın BUILD dosyasındaki beyanının konumu yazdırılır. Kaynak dosyalarda, gerçek dosyanın 1. satırının konumu yazdırılır. Oluşturulan bir dosya için, dosyayı oluşturan kuralın konumu yazdırılır. (Sorgu aracı, oluşturulan dosyanın gerçek konumunu bulmak için yeterli bilgiye sahip değildir ve henüz derleme yapılmadıysa her durumda mevcut olmayabilir.)

--output package

Bu seçenek, sonuç kümesinde bir hedefin ait olduğu tüm paketlerin adını yazdırır. Adlar alfabetik sırayla yazılır ve yinelenenler hariç tutulur. Resmi olarak bu, etiketler grubundan (paket, hedef) paketlere bir projeksiyondur.

Harici depolardaki paketler @repo//foo/bar olarak biçimlendirilirken ana depodaki paketler foo/bar olarak biçimlendirilir.

Bu çıkış seçeneği, deps(...) sorgusuyla birlikte belirli bir hedef kümesi oluşturmak için gözden geçirilmesi gereken paket kümesini bulmak amacıyla kullanılabilir.

Sonucun grafiğini görüntüleme

--output graph

Bu seçenek, sorgu sonucunun popüler AT&T GraphViz biçiminde yönlendirilmiş grafik olarak yazdırılmasına neden olur. Sonuç genellikle .png veya .svg gibi bir dosyaya kaydedilir. (dot programı iş istasyonunuzda yüklü değilse sudo apt-get install graphviz komutunu kullanarak yükleyebilirsiniz.) Örnek bir çağrı için aşağıdaki örnek bölümüne bakın.

Bu çıkış biçimi, özellikle --output label gibi doğrusal bir biçimde oluşturulduğunda kolayca görselleştirilemeyen bir yol grubu içeren allpaths, deps veya rdeps sorguları için kullanışlıdır.

Grafik varsayılan olarak çarpanı parantez dışına alınmış biçimde oluşturulur. Yani topolojik olarak eşdeğer düğümler, birden fazla etikete sahip tek bir düğümde birleştirilir. Bu, tipik sonuç grafikleri oldukça tekrar eden kalıplar içerdiğinden grafiği daha kompakt ve okunaklı hale getirir. Örneğin, bir java_library kuralı, tümü aynı genrule tarafından oluşturulan yüzlerce Java kaynak dosyasına bağlı olabilir. Ayrıştırılmış grafikte bu dosyaların tümü tek bir düğümle temsil edilir. Bu davranış, --nograph:factored seçeneğiyle devre dışı bırakılabilir.

--graph:node_limit n

Bu seçenek, çıkıştaki bir grafik düğümü için etiket dizesinin maksimum uzunluğunu belirtir. Daha uzun etiketler kısaltılır; -1, kısaltmayı devre dışı bırakır. Grafiklerin genellikle yazdırıldığı çarpanlara ayrılmış biçimden dolayı düğüm etiketleri çok uzun olabilir. GraphViz, bu seçeneğin varsayılan değeri olan 1.024 karakteri aşan etiketleri işleyemez. --output=graph kullanılmadığı sürece bu seçeneğin hiçbir etkisi yoktur.

--[no]graph:factored

Varsayılan olarak, grafikler yukarıda açıklandığı gibi çarpanlarına ayrılmış biçimde görüntülenir. --nograph:factored belirtildiğinde grafikler faktöre ayırmadan yazdırılır. Bu durum, GraphViz'i kullanarak görselleştirmeyi zorlaştırır ancak daha basit biçim, diğer araçlar (ör. grep) tarafından işlemeyi kolaylaştırabilir. --output=graph kullanılmadığı sürece bu seçeneğin hiçbir etkisi yoktur.

XML

--output xml

Bu seçenek, elde edilen hedeflerin XML biçiminde yazdırılmasına neden olur. Çıkış, aşağıdaki gibi bir XML üstbilgisiyle başlar

  <?xml version="1.0" encoding="UTF-8"?>
  <query version="2">

ve ardından sonuç grafiğindeki her hedef için topolojik sırada (sıralı olmayan sonuçlar istenmediği sürece) bir XML öğesiyle devam eder ve ardından sonlandırıcı bir

</query>

file türündeki hedefler için basit girişler yayınlanır:

  <source-file name='//foo:foo_main.cc' .../>
  <generated-file name='//foo:libfoo.so' .../>

Ancak kurallar için XML yapılandırılır ve değerinin kuralın BUILD dosyasında açıkça belirtilmediği özellikler de dahil olmak üzere kuralın tüm özelliklerinin tanımlarını içerir.

Ayrıca, sonuçta rule-input ve rule-output öğeleri bulunur. Böylece, bağımlılık grafiğinin topolojisi, örneğin srcs özelliğinin öğelerinin ileriye dönük bağımlılıklar (önkoşullar) ve outs özelliğinin içeriğinin geriye dönük bağımlılıklar (kullanıcı) olduğunu bilmek zorunda kalmadan yeniden oluşturulabilir.

--noimplicit_deps belirtilirse dolaylı bağımlılıklar için rule-input öğeleri atlanır.

  <rule class='cc_binary rule' name='//foo:foo' ...>
    <list name='srcs'>
      <label value='//foo:foo_main.cc'/>
      <label value='//foo:bar.cc'/>
      ...
    </list>
    <list name='deps'>
      <label value='//common:common'/>
      <label value='//collections:collections'/>
      ...
    </list>
    <list name='data'>
      ...
    </list>
    <int name='linkstatic' value='0'/>
    <int name='linkshared' value='0'/>
    <list name='licenses'/>
    <list name='distribs'>
      <distribution value="INTERNAL" />
    </list>
    <rule-input name="//common:common" />
    <rule-input name="//collections:collections" />
    <rule-input name="//foo:foo_main.cc" />
    <rule-input name="//foo:bar.cc" />
    ...
  </rule>

Bir hedefe ait her XML öğesi, değeri hedefin etiketi olan bir name özelliği ve değeri --output location tarafından yazdırılan hedefin konumu olan bir location özelliği içerir.

--[no]xml:line_numbers

XML çıkışında görüntülenen konumlar varsayılan olarak satır numaraları içerir. --noxml:line_numbers belirtildiğinde satır numaraları yazdırılmaz.

--[no]xml:default_values

XML çıkışı varsayılan olarak, değeri bu tür bir özellik için varsayılan değer olan kural özelliğini içermez (örneğin, BUILD dosyasında belirtilmediyse veya varsayılan değer açıkça sağlandıysa). Bu seçenek, bu tür özellik değerlerinin XML çıkışına dahil edilmesine neden olur.

Normal ifadeler

Sorgu dilindeki normal ifadeler Java normal ifade kitaplığını kullanır. Bu nedenle, java.util.regex.Pattern için tam söz dizimini kullanabilirsiniz.

Harici depolarla sorgu oluşturma

Derleme, harici depolardaki (WORKSPACE dosyasında tanımlanan) kurallara dayanıyorsa sorgu sonuçları bu bağımlılıkları içerir. Örneğin, //foo:bar, //external:some-lib'e bağlıysa ve //external:some-lib, @other-repo//baz:lib'ye bağlıysa bazel query 'deps(//foo:bar)', hem @other-repo//baz:lib hem de //external:some-lib'ü bağımlılık olarak listeler.

Harici depolar, derlemenin bağımlılıkları değildir. Yani yukarıdaki örnekte //external:other-repo bir bağımlılık değildir. Bununla birlikte, //external paketinin bir üyesi olarak sorgulanabilir. Örneğin:

  # Querying over all members of //external returns the repository.
  bazel query 'kind(http_archive, //external:*)'
  //external:other-repo

  # ...but the repository is not a dependency.
  bazel query 'kind(http_archive, deps(//foo:bar))'
  INFO: Empty results