Bazel Sorgu Referansı

Bu sayfa, derleme bağımlılıklarını analiz etmek için bazel query kullandığınızda kullanılan Bazel Sorgu Dili için referans kılavuzudur. bazel query tarafından desteklenen çıkış biçimleri de açıklanmaktadır.

Pratik kullanım örnekleri için Bazel Sorgu Nasıl Yapılır? bölümüne bakın.

Ek sorgu referansı

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

Eylem grafiği sorgusu

İşlem grafiği sorgusu (aquery) analiz sonrası Yapılandırılmış Hedef Grafiği üzerinde çalışır ve İşlemler, Yapılar ve bunların ilişkileri hakkında bilgi sunar. aquery, Yapılandırılmış Hedef Grafiği'nden oluşturulan İşlemlerin/Yapıların özellikleriyle ilgileniyorsanız yararlıdır. Örneğin, gerçek komutlar çalışır ve bunların girişleri, çıkışları ve anımsatıcılar.

Daha fazla ayrıntı için sorgu referansına bakın.

Yapılandırılabilir sorgu

Geleneksel Bazel sorgusu, yükleme sonrası aşama hedef grafiği üzerinde çalıştırılır ve dolayısıyla yapılandırmalar ve bunlarla ilişkili kavramlar hakkında bilgi içermez. Özellikle seçili ifadeleri doğru şekilde çözümlemez 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 bir şekilde işler ancak bu orijinal sorgunun tüm işlevlerini sunmaz.

Daha fazla bilgi için cquery referansına bakın.

Örnekler

Kullanıcılar bazel query ürününü nasıl kullanıyor? Tipik örnekler:

//foo ağacı neden //bar/baz alanına bağımlı? Bir yol göster:

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

Tüm foo testlerinin hangi C++ kitaplıkları foo_bin hedefinin yapmamasına bağlı olur?

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

Jetonlar: Söz dizimi söz dizimi

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

  • Anahtar kelimeler (ör. let). Anahtar kelimeler, dil için ayrılmış kelimelerdir. Her biri aşağıda açıklanmıştır. Tüm anahtar kelime takımı şudur:

  • "foo/...", ".*test rule" veya "//bar/baz:all" gibi kelimeler. Bir karakter dizisi "tırnak içinde" (tek tırnak ile başlayıp biter veya çift tırnak ile başlayıp biterse) kelimedir. Bir karakter dizisi tırnak içine alınmamışsa yine de kelime olarak ayrıştırılabilir. Tırnak içinde olmayan kelimeler; A'dan Za-z alfabe karakterlerinden, 0-9 arasındaki sayılardan ve */@.-_:$~[] özel karakterlerden (yıldız, öne eğik çizgi, @ nokta, kısa çizgi, alt çizgi, iki nokta, dolar işareti, yaklaşık işareti, sol köşeli ayraç, sağ köşeli parantez) oluşturulan karakter dizileridir. Ancak, göreli [hedef adlar][(/Concepts/labels#target-names) bu karakterlerle başlasa da, tırnak içine alınmamış kelimeler kısa çizgi - veya yıldız * ile başlayamaz.

    Tırnak içinde olmayan kelimeler, hedef adlarda bu karakterlere izin verilse bile, artı işareti + veya eşittir işareti = 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 alıntı yapılması 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 alıntının, kabuğunuzun gerektirdiği herhangi bir alıntıya ek olarak yazıldığını unutmayın. Örneğin:

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

    Anahtar kelimeler alıntılandığında normal kelimeler olarak kabul edilir. Örneğin, some bir anahtar kelimeyken "bazıları" bir kelimedir. Hem foo hem de "foo" kelimedir.

    Ancak hedef adlarında tek veya çift tırnak kullanırken dikkatli olun. Bir veya daha fazla hedef adından alıntı yaparken yalnızca tek bir tırnak türü (tümü tek veya tümü çift tırnak) kullanın.

    Aşağıda, Java sorgu dizesinin ne olacağına ilişkin örnekler 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 dizimini, çoğu durumda tırnak işaretlerine gerek kalmaması için seçtik. (Olağan dışı) ".*test rule" örneği tırnak işareti gerektirir: Nokta ile başlar ve boşluk içerir. "cc_library" alıntısı yapmak gereksiz olsa da zararsızdır.

  • Noktalama; ör. (), nokta . ve virgül ,. Noktalama içeren kelimeler (yukarıda listelenen istisnalar dışında) tırnak içine alınmalıdır.

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

Bazel sorgu dili kavramları

Bazel sorgu dili ifadelerin dilidir. Her ifade, kısmen sıralanmış bir hedef grubu veya eşdeğer olarak bir hedef grafiği (DAG) olarak değerlendirilir. Tek veri türü budur.

Küme ve grafik aynı veri türüne karşılık gelir, ancak verinin farklı yönlerini vurgulayın. Örneğin:

  • Ayarla: Hedeflerin kısmi sırası ilginç değildir.
  • Grafik: Hedeflerin kısmi sırası önemlidir.

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

Derleme bağımlılık grafiklerinin döngüsel olması gerekir.

Sorgu dili tarafından kullanılan algoritmalar, döngüsel grafiklerde kullanılmak üzere tasarlanmıştır ancak döngülere karşı dayanıklıdır. Döngülerin nasıl işlendiğiyle ilgili ayrıntılar belirtilmemiştir ve bu ayrıntılara güvenilmemelidir.

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

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

bazel query, sorgu sonucunu hesaplarken varsayılan olarak örtülü bağımlılıkları dikkate alır. Bu davranış, --[no]implicit_deps seçeneğiyle değiştirilebilir. Sorgu, yapılandırmaları dikkate almadığından potansiyel araç zincirlerinin asla dikkate alınmadığını unutmayın.

Ses düzeyi

Bazel sorgu dili ifadeleri, derleme bağımlılık grafiği üzerinde çalışır. Bu grafik, tüm BUILD dosyalarındaki tüm kural bildirimleri tarafından dolaylı olarak tanımlanır. Bu grafiğin biraz soyut olduğunu ve bir derlemenin tüm adımlarının nasıl gerçekleştirileceğine dair kapsamlı bir açıklama sunmadığını anlamak önemlidir. Bir derleme gerçekleştirmek için yapılandırma da gerekir. Daha ayrıntılı bilgi için Kullanıcı Kılavuzu'nun yapılandırmalar bölümüne bakın.

Bazel sorgu dilindeki bir ifadenin değerlendirilmesinin sonucu tüm yapılandırmalar için doğrudur. Bu, tam olarak kesin olmayan ve konservatif bir aşırı yaklaşık tahmin olabileceği anlamına gelir. Sorgu aracını bir derleme sırasında gereken tüm kaynak dosya kümesini hesaplamak için kullanırsanız, sorgu aracı, örneğin derlemenizde kullanmayı amaçlamıyor olsanız bile mesaj çevirisini desteklemek için gereken tüm dosyaları içerdiğinden, gerçekte gerekenden daha fazlasını raporlayabilir.

Grafik düzeninin korunması hakkında

İşlemler, alt ifadelerinden devralınan tüm sıralama kısıtlamalarını korur. Bunu "kısmi sıranın korunduğu yasa" gibi düşünebilirsiniz. Şu örneği düşünün: Belirli bir hedefin bağımlılıklarının geçişli olarak kapanmasını belirlemek için bir sorgu yayınlarsanız, elde edilen küme bağımlılık grafiğine göre sıralanır. Yalnızca file türündeki hedefleri içerecek şekilde filtre uygularsanız ortaya çıkan alt kümedeki her hedef çifti arasında aynı geçişli kısmi sıralama ilişkisi geçerli olur (bu çiftlerden hiçbiri orijinal grafikte doğrudan bağlı olmasa da). (Derleme bağımlılık grafiğinde dosya dosyası kenarı yoktur).

Bununla birlikte, tüm operatörler sırayı korusa da set işlemleri gibi bazı işlemler kendi sıralama kısıtlamalarını uygulamaz. Şu ifadeyi ele alalım:

deps(x) union y

Nihai sonuç kümesinin sırası, alt ifadelerinin tüm sıralama kısıtlamalarının korunacağı, diğer bir deyişle x öğesinin tüm geçişli bağımlılıklarının birbirine göre doğru şekilde sıralanacağı garanti edilir. Ancak sorgu, y içindeki hedeflerin sıralamasıyla ilgili veya y içindeki hedeflere kıyasla deps(x) konumundaki hedeflerin sıralamasıyla ilgili hiçbir şey garanti etmez (y bölgesinde de deps(x) içinde olan hedefler hariç).

Sıralama kısıtlamalarının eklendiği operatörler arasında allpaths, deps, rdeps, somepath ve hedef kalıp joker karakterleri package:*, dir/... vb. bulunur.

Gökyüzü sorgusu

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

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

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

Evren kapsamı belirleme

Sky Query modu, şu iki bayrağın iletilmesiyle etkinleştirilir: (--universe_scope veya --infer_universe_scope) ve --order_output=no. --universe_scope=<target_pattern1>,...,<target_patternN>, sorguya hedef kalıpların belirttiği hedef kalıbın geçişli kapanışını önceden yüklemesini söyler. Bu işlem hem toplama hem de çıkarma olabilir. Daha sonra 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'a sorgu ifadesinden --universe_scope için bir değer çıkarmasını söyler. Tahmin edilen bu değer, sorgu ifadesindeki benzersiz hedef kalıplarının listesidir ancak istediğiniz bu olmayabilir. Örneğin:

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

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

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

Ancak --universe_scope ile yapılan bu sorgunun sonucu yalnızca //my:target olur. //my:target türünün ters bağımlılıklarının hiçbiri, oluşturma yoluyla evrende değildir. Öte yandan şunları 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, tanımı belirli bir .bzl dosyasını kullanan hedeflere geçişli olarak bağlı olan bazı dizinlerdeki hedeflerin tests genişletmesindeki test hedeflerini hesaplamaya çalışan anlamlı bir sorgu çağrısıdır. Burada --infer_universe_scope, özellikle --universe_scope seçiminin başka şekilde sorgu ifadesini sizin ayrıştırmanızı gerektireceği durumlarda kullanışlıdır.

Bu nedenle, allrdeps ve rbuildfiles gibi evren kapsamlı operatörler kullanan sorgu ifadeleri için --infer_universe_scope yalnızca istediğiniz davranışı sergiliyorsa kullanmanız gerekir.

Sky Query'nin varsayılan sorguya göre bazı avantajları ve dezavantajları vardır. Ana dezavantajı, çıktılarını grafik sırasına göre sıralayamadığı ve bu nedenle belirli çıktı biçimlerinin yasaklanmasıdır. Bunun avantajı, varsayılan sorguda bulunmayan iki operatör (allrdeps ve rbuildfiles) sağlamasıdır. Ayrıca Sky Query, yeni bir grafik oluşturmak yerine Skyframe grafiğinin içini inceleyerek çalışır. Varsayılan olarak bu şekilde bir grafik oluşturulur. Bu nedenle, daha hızlı olduğu ve daha az bellek kullandığı bazı durumlar vardır.

İfadeler: Dilbilgisinin söz dizimi ve anlambilim

Bu, EBNF gösterimiyle ifade edilen Bazel sorgu dilinin 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 gramerin her bir üretimi sırayla açıklanmıştır.

Hedef kalıpları

expr ::= word

Sözdizimsel olarak, hedef kalıp yalnızca bir kelimeden oluşur. 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ümeyi değerlendirir.

Hedef kalıpları, paketler ve hedefler üzerine joker karakterler eklemek için etiketleri genelleştirir. Örneğin, foo/...:all (veya yalnızca foo/...), foo dizininin altında bulunan ve her paketteki tüm kuralları tekrarlı olarak içeren bir kümeyi değerlendiren bir hedef kalıptır. bar/baz:all, bar/baz paketindeki tüm kuralları içeren bir kümeyi değerlendiren, ancak alt paketlerini kapsamayan bir hedef kalıbıdır.

Benzer şekilde foo/...:*, foo dizininin altında yinelemeli olarak her paketteki tüm hedefleri (kurallar ve dosyaları) içeren bir kümeyi değerlendiren bir hedef kalıbıdır. bar/baz:*, bar/baz paketindeki tüm hedefleri içeren, ancak alt paketlerini içeren bir kümeyi değerlendirir.

:* joker karakteri, dosyaların yanı sıra kurallarla da eşleştiğinden sorgular için genellikle :all karakterinden daha yararlıdır. Buna karşılık, :all joker karakteri (foo/... gibi hedef kalıplarda örtülü) genellikle derlemeler için daha yararlıdır.

bazel query hedef kalıpları, bazel build derleme hedefleriyle aynı şekilde çalışır. Daha fazla bilgi için Hedef Kalıpları bölümüne bakın veya bazel help target-syntax yazın.

Hedef kalıpları, tekil bir kümeye (etikette olması durumunda), birçok öğe içeren bir kümeye (binlerce öğe içeren foo/... durumunda olduğu gibi) veya hedef kalıp hiçbir hedefle eşleşmiyorsa boş kümeye dönüşebilir.

Bir hedef kalıbı ifadesi sonucunda ortaya çıkan tüm düğümler, bağımlılık ilişkisine göre birbirine göre doğru şekilde sıralanır. Dolayısıyla, foo:* sonucu yalnızca foo paketindeki hedef grubu değildir, aynı zamanda bu hedefler üzerindeki bir grafik de olur. (Sonuç düğümlerinin diğer düğümlere göre göreli sıralamasıyla ilgili herhangi bir garanti verilmez.) Daha fazla ayrıntı 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 bunlara referans verilmesine olanak tanır. let ifadesinin değerlendirmesinin sonucu, expr2 değişkeninin değerlendirmesiyle aynıdır; name değişkeninin tüm serbest durumları 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.

Çevreleyen let name = ... ifadesi dışında bir değişken referansı name olması hatadır. Diğer bir deyişle, üst düzey sorgu ifadelerinde serbest değişkenler bulunamaz.

Yukarıdaki dil bilgisi üretimlerinde name, word gibidir ancak C programlama dilinde yasal tanımlayıcı olması ek kısıtlaması vardı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 veya bir kelimeden oluşur ve söz dizimi belirsizliği ortaya çıkar. Bununla birlikte, herhangi bir anlam belirsizliği yoktur, çünkü yasal değişken adları olan kelimelerin alt kümesi, yasal hedef kalıpları olan kelime alt kümesinden ayrıdır.

Teknik açıdan, let ifadeleri sorgu dilinin ifade gücünü artırmaz: Dilde ifade edilebilen tüm sorgular, bu ifadeler olmadan da ifade edilebilir. Ancak bu uygulamalar, birçok sorgunun kısa ve öz olmasını sağlar ve sorgu değerlendirmesinin daha verimli olmasını sağlar.

Parantez içindeki ifadeler

expr ::= (expr)

Parantezler bir değerlendirme sırasını zorlamak 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, bütün, fark kümesi

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

Bu üç operatör, olağan set işlemlerini kendi bağımsız değişkenleri üzerinden hesaplar. Her operatörün intersect gibi nominal bir ve ^ gibi sembolik bir biçim olmak üzere iki biçimi vardır. Her iki biçim de eşdeğerdir; sembolik biçimler daha hızlı yazılır. (Daha açık şekilde belirtmek gerekirse bu sayfanın geri kalanında nominal biçimler kullanılmıştır.)

Örneğin,

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

foo/... ile eşleşen, ancak foo/bar/... ile eşleşmeyen hedef grubunu değerlendirir.

Aynı sorguyu şu şekilde yazabilirsiniz:

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

intersect (^) ve union (+) işlemleri değişmelidir (simetrik); except (-) asimetriktir. Ayrıştırıcı, bu üç operatörün tümünü sol-ilişkisel olarak ve eşit öncelikte işler, bu nedenle parantez kullanmanız gerekebilir. Örneğin, bu ifadelerden ilk ikisi eşdeğerdir, ancak üçüncüsü eşdeğer değildir:

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

Harici bir kaynaktan okuma hedefleri: ayarlayın

expr ::= set(word *)

set(a b c ...) operatörü, sıfır veya daha fazla hedef kalıplarının boşlukla (virgülsüz) ayrılmış olarak birleşimini hesaplar.

set(), Bourne kabuğunun $(...) özelliğiyle birlikte, bir sorgunun sonuçlarını normal bir metin dosyasında kaydetme, bu metin dosyasını diğer programlar (standart UNIX kabuğu araçları gibi) kullanarak değiştirme ve ardından sonucu, işleme için bir değer olarak tekrar sorgu aracına sunma anlamına gelir. Ö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)),bir awk programı kullanılarak maxrank değerlerine göre filtre uygulanarak hesaplanmıştı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) için bir kısaltmadı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şlevleri 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ın geçici olarak kapatılması: deps

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

deps(x) operatörü, x bağımsız değişken grubunun bağımlılıklarının geçişli olarak kapatılmasıyla oluşturulan grafiği değerlendirir. Örneğin, deps(//foo) değeri, tüm bağımlılıkları dahil olmak üzere foo tek düğümünden alınan bağımlılık grafiğidir. deps(foo/...) değeri, kökleri foo dizininin altındaki her pakette bulunan tüm kurallardan oluşan 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ı burada yer almamaktadır. 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şkeni kabul eder. Bu bağımsız değişken, aramanın derinliğinde bir üst sınırı belirten bir tam sayıdır. Dolayısıyla deps(foo:*, 0), foo paketindeki tüm hedefleri döndürürken deps(foo:*, 1), foo paketindeki herhangi bir hedefin doğrudan ön koşullarını da içerir ve deps(foo:*, 2), deps(foo:*, 1) içindeki düğümlerden doğrudan ulaşılabilen düğümleri de içerir ve bu şekilde 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ız olur: Ön koşulların dönüşlü geçişli kapanmasını hesaplar.

Ters bağımlılıkların geçici olarak kapatılması: rdeps

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

rdeps(u, x) operatörü, u evren grubunun geçişli kapanması dahilinde x bağımsız değişkeni grubunun ters bağımlılıklarını değerlendirir.

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

rdeps operatörü, isteğe bağlı üçüncü bir bağımsız değişkeni kabul eder. Bu bağımsız değişken, aramanın derinliğinde bir üst sınırı belirten bir tam sayıdır. Ortaya çıkan grafik, yalnızca bağımsız değişken kümesindeki herhangi bir düğümden belirtilen derinlikteki düğümleri içerir. Dolayısıyla rdeps(//foo, //common, 1), //foo'in geçişli kapanmasında doğrudan //common öğesine bağlı olan tüm düğümleri değerlendirir. (Bu sayılar, minrank çıkış biçiminde gösterilen sıralamalara karşılık gelir.) depth parametresi atlanırsa arama sınırsız olur.

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

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

allrdeps operatörü, rdeps operatörü gibi davranır ancak "evren grubu", --universe_scope işaretinin değeri ayrı olarak belirtilmez. Dolayısıyla, --universe_scope=//foo/... iletildiyse allrdeps(//bar), rdeps(//foo/..., //bar) değerine eşdeğerdir.

Aynı pakette 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 kümesindeki bir hedefle aynı pakette bulunan ve doğrudan ona bağlı olan hedef grubunun tamamını değerlendirir.

Bir hedefin paketiyle ilgilenme: kardeşler

expr ::= siblings(expr)

siblings(x) operatörü, bağımsız değişken grubundaki bir hedefle aynı paketteki hedef grubunun tamamını değerlendirir.

Rastgele seçim: bazı

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

some(x, k) operatörü, x bağımsız değişken kümesinden rastgele olarak en fazla k hedefi seçer ve yalnızca bu hedefleri içeren bir kümeyi değerlendirir. k parametresi isteğe bağlıdır. Eksikse sonuç, rastgele seçilen yalnızca bir hedef içeren bir tekil dizi olur. x bağımsız değişken grubunun boyutu k değerinden küçükse x bağımsız değişken grubunun tamamı döndürülür.

Örneğin, some(//foo:main union //bar:baz) ifadesi, //foo:main veya //bar:baz içeren bir tekil küme olarak değerlendirilir. Ancak bu küme tanımlanmamış olur. 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 bir tekil ise some, kimlik işlevini hesaplar: some(//foo:main), //foo:main değerine eşdeğerdir.

Belirtilen bağımsız değişken grubu, some(//foo:main intersect //bar:baz) ifadesinde olduğu gibi boşsa bir hata oluştu.

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 bir başlangıç noktası S ve bir dizi bitiş noktası E olmak üzere iki bağımsız değişkeni kabul eder. somepath, S bölgesindeki bir hedeften E içindeki bir hedefe bazı rastgele yol üzerindeki düğümlerin grafiğini döndürür. allpaths, S içindeki herhangi bir hedefin tüm yollarındaki düğümlerin grafiğini E içindeki herhangi bir hedefe döndürür.

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

Bir yol
somepath(S1 + S2, E), bir olası sonuç.
Bir yol
somepath(S1 + S2, E), başka bir olası sonuç.
Tüm yollar
allpaths(S1 + S2, E)

Hedef tür filtrelemesi: tür

expr ::= kind(word, expr)

kind(pattern, input) operatörü, bir hedef grubuna filtre uygular ve beklenen türde olmayan hedefleri siler. pattern parametresi, ne tür bir hedefin eşleneceğini belirtir.

Örneğin, aşağıda gösterilen BUILD dosyası tarafından tanımlanan dört hedefin (p paketi için) 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 grubu olarak değerlendirilir. kind("source file", deps(//foo)) ise //foo hedefinin bağımlılıklarının geçişli olarak kapatılmasındaki tüm kaynak dosyaları grubuna göre değerlendirme yapar.

pattern bağımsız değişkeninin tırnak içine alınması genellikle gereklidir, çünkü bu bağımsız değişken olmadan source file ve .*_test gibi birçok normal ifade ayrıştırıcı tarafından kelime olarak kabul edilmez.

package group için eşleşme yapılırken, :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 formda) kalıpla eşleşmeyen hedefleri atar; girişlerinin bir alt kümesini değerlendirir.

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

Bu operatör genellikle intersect operatörüne çok daha hızlı ve daha güçlü bir alternatif sağlar. Örneğin, //foo:foo hedefinin tüm bar bağımlılıklarını görmek için yeni bir dönüşüm hedefi

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 neden olabilir. Bunun bir alternatifi de olabilir:

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

Bu işlem önce //foo bağımlılık grubunu hesaplar, ardından yalnızca sağlanan kalıpla eşleşen hedefleri filtreler. Diğer bir ifadeyle, alt dize olarak //bar içeren adlara sahip hedefler.

filter(pattern, expr) operatörünün yaygın olarak kullanılan bir başka kullanımı da 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 dosyanın listesini sağlayacak.

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ımlı olmayan kural hedeflerini veya özellik değerinin sağlanan normal ifadeyle pattern eşleşmediği kural hedeflerini atar. Girişlerinin bir alt kümesini değerlendirir.

Birinci bağımsız değişken olan name, sağlanan normal ifade kalıbıyla eşleşmesi gereken kural özelliğinin adıdır. İkinci bağımsız değişken olan pattern, özellik değerleri üzerindeki normal bir ifadedir. attr ifadesi tüm hedefleri içeren x grubunu değerlendirir. Böylece x, input kümesinin üyesidir, name tanımlı özelliğine sahip bir kuraldır ve özellik değeri pattern normal ifadesi için (bağlanmamış) eşleşme içerir. name isteğe bağlı bir özellikse ve kural bunu açıkça belirtmiyorsa karşılaştırma için varsayılan özellik değeri kullanılır. Örneğin,

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

bir linkshared özelliğine (cc_binary kuralı gibi) izin verilen tüm //foo bağımlılıklarını seçer ve bu bağımlılığı açıkça 0 olarak ayarlar ya da varsayılan değer 0 dışında hiç ayarlamaz (ör. cc_binary kuralları için).

Liste türü özellikleri (ör. srcs, data vb.) [ paranteziyle başlayan, ] ayracı ile biten ve birden çok değeri sınırlamak için "," (virgül, boşluk) kullanılarak [value<sub>1</sub>, ..., value<sub>n</sub>] biçiminde dizelere dönüştürülür. Etiketler, etiketin mutlak biçimi kullanılarak dizelere dönüştürülür. Örneğin, bir deps=[":foo", "//otherpkg:bar", "wiz"] özelliği [//thispkg:foo, //otherpkg:bar, //thispkg:wiz] dizesine dönüştürülür. Köşeli parantezler her zaman mevcuttur. Bu nedenle, boş liste eşleştirme amacıyla [] dize değerini kullanır. Örneğin,

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

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

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

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

Bir liste türü özelliğinde belirli bir value içeren //foo bağımlılıkları arasından tüm kuralları seçmek için

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

value tarihinden önceki karakter [ veya bir boşluk, value karakterinden sonraki karakter ise virgül ya da ] olacağından bu yöntem işe yarar.

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

expr ::= visible(expr, expr)

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

Birinci bağımsız değişken olan predicate, çıkıştaki tüm hedeflerin görünür olması gereken bir hedef kümesidir. Bir visible ifadesi, x tüm hedeflerini içeren bir küme olarak değerlendirilir. Böylece x, input kümesinin bir üyesi olur ve predicate x içindeki tüm hedefler y tarafından görülebilir.y Örneğin:

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

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

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

expr ::= labels(word, expr)

labels(attr_name, inputs) operatörü, inputs grubundaki bazı kurallarda "label" veya "list of label" 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 kümesinde srcs özelliklerine sahip birden fazla kural varsa srcs özelliklerinin birleşimi döndürülür.

test_suites: testlerini genişletin ve filtreleyin

expr ::= tests(expr)

tests(x) operatörü, x kümesindeki tüm test kuralları grubunu döndürür, tüm test_suite kurallarını başvurduğu bağımsız test grubuna genişletir, tag ve size ölçütlerine göre filtreleme uygular.

Varsayılan olarak, sorgu değerlendirmesi tüm test_suite kurallarındaki test dışı hedefleri yoksayar. Bu, --strict_test_suite seçeneği kullanılarak hatalar 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 olarak) 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: Buna, test_suite kuralları aracılığıyla doğrudan veya dolaylı olarak referans verilen diğer paketlere ait olan testler de dahil olabilir.

Paket tanımı dosyaları: derleme dosyaları

expr ::= buildfiles(expr)

buildfiles(x) operatörü, x kümesindeki her bir hedefin paketlerini tanımlayan dosya grubunu döndürür. Diğer bir deyişle, her paket için BUILD dosyasını ve load aracılığıyla başvuruda bulunduğu .bzl dosyalarını döndürür. Bunun, bu load dosyalarını içeren paketlerin BUILD dosyalarını da döndürdüğünü unutmayın.

Bu operatör, genellikle belirtilen bir hedef 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 öğesinin geçişli olarak bağlı olduğu tüm paketlerin grubunu döndürür.

Paket tanımı dosyaları: rbuildfiles

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

rbuildfiles operatörü, yol parçalarının virgülle ayrılmış listesini alır ve bu yol parçalarına geçişli olarak bağlı olan BUILD dosya 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 hedefinin yanı sıra //bar:file.bzl yükleyen diğer BUILD dosyalarının hedeflerini de döndürür.

rbuildfiles operatörünün kapsamı, --universe_scope işaretiyle belirtilen evrendir. Doğrudan BUILD ve .bzl dosyalarına karşılık gelmeyen dosyalar sonuçları etkilemez. Örneğin, kaynak dosyalar (foo.cc gibi) BUILD dosyasında açıkça belirtilse bile yoksayılır. Ancak sembolik bağlantılara saygı duyulur. foo/BUILD, bar/BUILD için kullanılan sembolik bir bağlantıysa rbuildfiles(bar/BUILD), sonuçlarına //foo:BUILD ifadesini ekler.

rbuildfiles operatörü, neredeyse ahlaki olarak buildfiles operatörünün tersidir. Bununla birlikte, bu ahlaki ters çevirme bir yönde daha güçlüdür: rbuildfiles çıktıları, buildfiles girdileri gibidir; birincisi paketlerde yalnızca BUILD dosya hedefleri içerir, ikincisi ise bu tür hedefleri içerebilir. Diğer yöndeyse yazışma daha zayıftır. buildfiles operatörünün çıkışları, tüm paketlere veBelirli bir giriş için gereken bzl dosya. Bununla birlikte, 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ı: yükleme dosyaları

expr ::= loadfiles(expr)

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

Çıkış biçimleri

bazel query bir grafik oluşturur. bazel query ürününün bu grafiği sunduğu içeriği, biçimi ve sıralamayı --output komut satırı seçeneği aracılığıyla belirlersiniz.

Gökyüzü Sorgusu ile çalışırken, yalnızca sıralanmamış çıkışla uyumlu çıkış biçimlerine izin verilir. Özellikle graph, minrank ve maxrank çıkış biçimleri yasaktır.

Bazı çıkış biçimleri ek seçenekleri kabul eder. Her çıkış seçeneğinin adında, geçerli olduğu çıkış biçiminin önüne eklenir. Bu nedenle --graph:factored, yalnızca --output=graph kullanılırken geçerli olur. graph dışında bir çıkış biçimi kullanılırsa herhangi bir etkisi olmaz. Benzer şekilde, --xml:line_numbers yalnızca --output=xml kullanılırken geçerlidir.

Sonuçların sıralaması hakkında

Sorgu ifadeleri her zaman "grafik düzeninin korunumu yasası"na uygun olsa da, sonuçların bağımlılık sıralı veya sırasız biçimde sunulması yapılabilir. Bu, sonuç kümesindeki hedefleri veya sorgunun hesaplanma şeklini etkilemez. Yalnızca sonuçların Stdout'a nasıl yazdırıldığını etkiler. Ayrıca, bağımlılık sırasında eş değer olan düğümler alfabetik olarak sıralanmış veya alfabetik olarak sıralanmamış olabilir. 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 kullanımdan kaldırılmıştır.)

Bu işaretin varsayılan değeri auto olup sonuçları sözlük sıralaması olarak yazdırır. Ancak somepath(a,b) kullanıldığında sonuçlar deps sırasına göre yazdırılır.

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

Bu işaret deps olduğunda Bazel baskıları bazı topolojik sıralamayla, yani önce bağımlılıklar ile sonuçlanır. Bununla birlikte, bağımlılık sırasına göre sıralanmayan (ikisinden diğerine yol olmadığı için) düğümler herhangi bir sırada yazdırılabilir.

Bu işaret full olduğunda, Bazel düğümleri tamamen belirleyici (toplam) bir sırada yazdırır. Öncelikle, tüm düğümler alfabetik olarak sıralanır. Daha sonra, listedeki her düğüm, sipariş sonrası derinlik öncelikli aramanın başlangıcı olarak kullanılır. Ziyaret edilmeyen düğümlere giden kenarlar, takip eden düğümlerin alfabetik sırasına göre geçer. Son olarak, düğümler ziyaret edilen sıranın tersi yönde yazdırılır.

Bu sıradaki düğümler daha yavaş olabilir. Bu nedenle yalnızca determinizm önemli olduğunda kullanılmalıdır.

Hedeflerin kaynak biçimini, DERLEME işleminde görünecekleri şekilde yazdırın

--output build

Bu seçenekte, her hedef DERLEME dilinde elle yazılmış gibi temsil edilir. Tüm değişkenler ve işlev çağrıları (glob, makrolar gibi) genişletildiğinden Starlark makrolarının etkisini görebilirsiniz. Buna ek olarak, her bir geçerli kural, geçerli kuralı oluşturmak için değerlendirilen makronun adını vererek bir generator_name ve/veya generator_function değeri bildirir.

Çıkış, BUILD dosyalarıyla aynı söz dizimini kullansa da geçerli bir BUILD dosyası üretileceği garanti edilmez.

--output label

Bu seçenekte, elde edilen grafikteki her bir hedefin ad kümesi (veya etiketleri) topolojik sırada, her satıra bir etiket olacak şekilde yazdırılır (--noorder_results belirtilmezse sonuçların sıralamasıyla ilgili notlara bakın). (Topolojik sıralama, bir grafik düğümünün tüm haleflerinden önce göründüğü sıralamadır.) Elbette bir grafiğin birçok topolojik sıralaması vardır (ters posta sıralaması yalnızca bir tanedir). Hangisinin seçileceği belirtilmemiştir.

Bir somepath sorgusunun çıktısını yazdırırken, düğümlerin yazdırıldığı sıra yol sırasıdır.

Dikkat: Bazı durumlarda aynı etikete sahip iki farklı hedef olabilir. Örneğin, sh_binary kuralı ve tek (örtülü) srcs dosyası foo.sh olarak adlandırılabilir. Bir sorgu sonucu bu hedeflerin ikisini de içeriyorsa çıkış (label biçiminde) bir kopya içeriyormuş gibi görünür. label_kind (aşağıya bakın) biçimi kullanıldığında, fark netlik kazanır: İki hedef aynı ada, ancak birinin sh_binary rule türüne ve diğerinin source file türüne sahiptir.

--output label_kind

label gibi, bu çıktı biçimi de sonuç grafiğindeki her bir hedefin etiketlerini topolojik sırada yazdırır, ancak ek olarak hedefin türü ile etiketten önce gelir.

--output minrank --output maxrank

label gibi, minrank ve maxrank çıkış biçimleri de ortaya çıkan grafikte her bir hedefin etiketlerini yazdırır, ancak bunlar topolojik sırada görünmek yerine sıralama sırasında ve öncesinde sıra numarasıyla görünür. Bunlar, sonuç sıralaması --[no]order_results işaretinden etkilenmez (sonuçların sıralamasıyla ilgili notlar).

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

maxrank her düğümü kök düğümden kendisine giden en uzun yolun uzunluğuna göre sıralar. Yine "köklerin" sıralaması 0'dır. Diğer tüm düğümlerin sıralaması, önceki tüm düğümlerinin maksimum sıralamasından bir daha yüksektir.

Bir döngüdeki tüm düğümlerin sıralaması eşit olarak kabul edilir. (Çoğu grafik çevrimseldir ancak BUILD dosyaları hatalı döngüler içerdiğinden döngüler basitçe gerçekleşir.)

Bu çıkış biçimleri, bir grafiğin ne kadar derin olduğunun keşfedilmesine yardımcı olur. deps(x), rdeps(x) veya allpaths sorgusunun sonucu için kullanılırsa sıralama numarası, ilgili sıralamadaki bir düğüme giden en kısa (minrank ile) veya en uzun (maxrank ile) yolun uzunluğuna eşit olur.x maxrank, bir hedef oluşturmak için gereken derleme adımlarının en uzun sırasını belirlemek amacıyla kullanılabilir.

Örneğin, soldaki grafik, --output minrank ve --output maxrank belirtildiğinde sağdaki çıktıları verir.

Sıralamada
      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 işlevinde olduğu gibi, bu seçenek de sonuçtaki her bir hedef için hedefin türünü ve etiketini yazdırır ancak hedefin konumunu dosya adı ve satır numarası olarak açıklayan bir dize ön ekine eklenir. Biçim, grep çıktısına benziyor. Böylece, ikinci kodu ayrıştırabilen (Emacs veya vi gibi) araçlar, bir dizi eşleşmeyi adım adım görmek için sorgu çıkışını da kullanabilir. Böylece, Bazel sorgu aracı bağımlılık-grafiğe duyarlı "DERLEME 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 söz konusu olduğunda, kural bildiriminin BUILD dosyasındaki konumu yazdırılır. Kaynak dosyalarda, gerçek dosyanın 1. satırı yazdırılır. Oluşturulan bir 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 bir derleme gerçekleştirilmemişse her durumda konum bilgisi olmayabilir.)

--output package

Bu seçenek, sonuç kümesindeki bir hedefin ait olduğu tüm paketlerin adını yazdırır. Adlar sözlük sıralamasına göre yazılır; kopyalar hariç tutulur. Resmî olarak bu, etiket grubundan (paket, hedef) paketlere yapılan bir projeksiyondur.

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

Bu çıkış seçeneği, deps(...) sorgusuyla birlikte belirli bir hedef grubu oluşturmak için satın alınması gereken paket grubunu bulmak için kullanılabilir.

Sonucun grafiğini görüntüleme

--output graph

Bu seçenek, sorgu sonucunun popüler AT&T GraphViz biçiminde yönlendirilen bir grafik olarak yazdırılmasına neden olur. Genelde sonuç .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 allpaths, deps veya rdeps sorguları için yararlıdır. Sonuçta, --output label gibi doğrusal bir biçimde oluşturulduğunda kolayca görselleştirilemeyen bir yol grubu bulunur.

Grafik, varsayılan olarak faktoriye biçimde oluşturulur. Yani, topolojik olarak eşdeğer olan düğümler birden fazla etikete sahip tek bir düğümde birleştirilir. Tipik sonuç grafikleri çok sayıda yinelenen kalıplar içerdiğinden, grafiği daha kısa ve okunabilir hale getirirsiniz. Örneğin, bir java_library kuralı, tümü aynı genrule tarafından oluşturulan yüzlerce Java kaynak dosyasına bağlı olabilir. Faktörlere dayalı grafikte, tüm bu dosyalar 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 değeri, kesmeyi devre dışı bırakır. Grafiklerin genellikle yazdırıldığı biçimdeki düğüm etiketleri çok uzun olabilir. GraphViz, bu seçeneğin varsayılan değeri olan 1024 karakteri aşan etiketleri işleyemez. --output=graph kullanılmadığı sürece bu seçeneğin hiçbir etkisi yoktur.

--[no]graph:factored

Grafikler, varsayılan olarak yukarıda açıklandığı gibi çarpanlara ayrılmış biçimde görüntülenir. --nograph:factored belirtildiğinde, grafikler çarpanlara ayırmadan yazdırılır. Bu, GraphViz kullanarak görselleştirmeyi pratik hale getirir ancak daha basit biçim, diğer araçlarla (grep gibi) 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, sonuçta elde edilen hedeflerin XML biçiminde yazdırılmasını sağlar. Çıkış şunun gibi bir XML üstbilgisiyle başlar:

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

ve daha sonra, sonuç grafiğindeki her hedef için topolojik sırada (sırasız sonuçlar istenmediği sürece) bir XML öğesiyle devam eder ve ardından sonlandırma

</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ılmıştır ve kuralının BUILD dosyasında değeri açıkça belirtilmeyenler de dahil olmak üzere kuralın tüm özelliklerinin tanımlarını içerir.

Buna ek olarak sonuç, rule-input ve rule-output öğelerini içerir. Böylece bağımlılık grafiğinin topolojisi, örneğin srcs özelliğinin öğelerinin ileri bağımlılıklar (ön koşullar) ve outs özelliğinin içeriğinin ise geriye dönük bağımlılıklar (tüketiciler) olduğu bilinmeden yeniden oluşturulabilir.

--noimplicit_deps belirtilirse dolaylı bağımlılıkların 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 hedefin her XML öğesi, değeri hedefin etiketi olan bir name özelliği ve bir location özelliği içerir. Bu özellik, hedefin --output location tarafından yazdırıldığı şekilde hedef konumudur.

--[no]xml:line_numbers

Varsayılan olarak, XML çıktısında görüntülenen konumlar satır numaraları içerir. --noxml:line_numbers belirtildiğinde satır numaraları yazdırılmaz.

--[no]xml:default_values

Varsayılan olarak XML çıkışı, değeri söz konusu özellik türü için varsayılan değer olan kural özelliğini içermez (örneğin, BUILD dosyasında belirtilmemişse veya varsayılan değer açık bir şekilde sağlanmışsa). 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. Böylece java.util.regex.Pattern için tam söz dizimini kullanabilirsiniz.

Harici depolarla sorgulama

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 değerine bağımlıysa ve //external:some-lib @other-repo//baz:lib öğesine bağlıysa bazel query 'deps(//foo:bar)', hem @other-repo//baz:lib hem de //external:some-lib öğelerini bağımlılık olarak listeler.

Harici depoların kendileri bir derlemenin bağımlılıkları değildir. Yani yukarıdaki örnekte //external:other-repo bir bağımlılık değildir. Ancak //external paketinin ü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