Bazel Sorgu Referansı

Sorun bildirin Kaynağı göster

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

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

Ek sorgu referansı

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

İşlem grafiği sorgusu

Eylem grafiği sorgusu (aquery), analiz sonrası Yapılandırılmış Hedef Grafik üzerinde çalışır ve İşlemler, Yapılar ve bunların ilişkileri hakkındaki bilgileri gösterir. aquery, Yapılandırılmış Hedef Grafik'ten oluşturulan İşlemler/Yapıların özellikleriyle ilgileniyorsanız kullanışlıdır. Örneğin, gerçek komutların yanı sıra bunların girişleri, çıkışları ve anımsatıcıları çalışır.

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ıştırılır. Bu nedenle, yapılandırmalar ve bunlarla ilgili kavramlar yoktur. Bu durum, select ifadeleri doğru şekilde çözümlemez ve bunun yerine seçimlerin olası tüm çözümlerini döndürür. Bununla birlikte, yapılandırılabilir sorgu ortamı cquery, yapılandırmaları düzgün şekilde işler ancak bu orijinal sorgunun tüm işlevlerini sunmaz.

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

Örnekler

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

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

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

Tüm foo testleri hangi C++ kitaplıklarına bağlıdır ve foo_bin hedefinin sağlamadığı gerçeğe bağlıdır?

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

Jetonlar: Sözlüksel söz dizimi

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

  • Anahtar kelimeler (ör. let). Anahtar kelimeler, ilgili dil için ayrılmış kelimelerdir ve aşağıda açıklanmıştır. Anahtar kelime kümesinin tamamı şöyledir:

  • "foo/...", ".*test rule" veya "//bar/baz:all" gibi kelimeler. Karakter dizisi "tırnak işareti" ise (tek tırnak ile başlayıp bitiyorsa veya çift tırnak "ile başlıyor ve sona eriyorsa ") bu bir kelimedir. Alıntılanan bir karakter dizisi, yine de kelime olarak ayrıştırılabilir. Tırnak işareti içinde olmayan kelimeler, A-Za-z arası alfabe karakterleri, 0-9 arası sayılar ve */@.-_:$~[] özel karakterleri (yıldız, eğik çizgi, , at, nokta, tire, alt çizgi, iki nokta, dolar işareti, yaklaşık işareti, sol köşeli ayraç, sağ köşeli parantez) arasındaki karakter dizileridir. Ancak göreli hedef adlar bu karakterlerle başlasa bile, tırnak içindeki olmayan kelimeler kısa çizgi - veya yıldız işaretiyle * başlayamaz.

    Ayrıca, hedef adlarda bu karakterlere izin verilse bile, tırnak içine alınmayan kelimeler artı işareti + veya eşittir = işaretini içeremez. Sorgu ifadeleri oluşturan kod yazılırken hedef adların tırnak içine alınması gerekir.

    Kullanıcı tarafından sağlanan değerlerden Bazel sorgu ifadeleri oluşturan komut dosyaları yazarken tırnak içine almak 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 gerekli olabileceği tüm alıntılara ek olarak yapıldığını 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 kabul edilir. Ö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ından alıntı yaparken yalnızca tek bir tırnak türü (tek tırnak veya tamamı ç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
    

    Çoğu durumda tırnak işaretlerine gerek olmaması için bu söz dizimini seçtik. (Olağan dışı) ".*test rule" örneğinin tırnak içine alınması gerekir: Örnek bir noktayla başlar ve boşluk içerir. "cc_library" alanından alıntı yapmak gereksizdir ancak zararsızdır.

  • Noktalama işaretleri (ör. () parantezleri, .. nokta ve ,). Noktalama işareti içeren kelimelerin (yukarıda listelenen istisnalar dışındaki) tırnak içine alınması gerekir.

Tırnak içine alınan kelimenin dışındaki boşluk karakterleri yoksayılır.

Bazel sorgu dili kavramları

Bazel sorgu dili, bir 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. Tek veri türü budur.

Set ve grafik aynı veri türüne işaret eder, ancak farklı yönlerini vurgulayın. Örneğin:

  • Ayarla: Hedeflerin kısmi sırası ilgi çekici değildir.
  • Grafik: 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 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 belirtilmemiştir ve bunlara güvenilmemelidir.

Dolaylı bağımlılıklar

Bazel, BUILD dosyalarında açık bir şekilde tanımlanan bağımlılıkları derlemenin yanı sıra kurallara ek dolaylı bağımlılıklar da 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.

Varsayılan olarak bazel query, sorgu sonucunu hesaplarken örtülü bağımlılıkları dikkate alır. Bu çalışma biçimi, --[no]implicit_deps seçeneği ile değiştirilebilir. Sorgunun yapılandırmaları dikkate almadığından olası araç zincirlerinin hiçbir zaman dikkate alınmadığını unutmayın.

Ses düzeyi

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

Bir ifadenin Bazel sorgu dilinde değerlendirilmesinin sonucu tüm yapılandırmalar için doğrudur. Bu, tam olarak kesin olmayan konservatif bir aşırı tahmin olabileceği anlamına gelir. Derleme sırasında gerekli olan tüm kaynak dosyaları kümesini hesaplamak için sorgu aracını kullanırsanız gerçekte gerekli olandan daha fazlasını raporlayabilir. Bunun nedeni, örneğin sorgu aracı, derlemenizde bu özelliği kullanmak istemeseniz bile mesaj çevirisini desteklemek için gereken tüm dosyaları içermesini sağlar.

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 korunumu yasası" olarak düşünebilirsiniz. Bir örnek verelim: Belirli bir hedefin bağımlılıklarının geçişli 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 ayarlanan bir filtre uygularsanız, elde edilen alt kümedeki her hedef çifti arasında aynı geçişli kısmi sıralama ilişkisi geçerlidir (bu çiftlerin hiçbiri aslında orijinal grafikte doğrudan bağlı olmasa bile). (Derleme bağımlılık grafiğinde dosya-dosya kenarları yoktur).

Ancak tüm operatörler sıralamayı korusa ancak set işlemleri gibi bazı işlemler kendi sıralama kısıtlamalarını kullanıma sunmaz. Şu ifadeye dikkat edin:

deps(x) union y

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

Sıralama kısıtlamaları sunan operatörler şunları içerir: allpaths, deps, rdeps, somepath ve hedef kalıp joker karakterleri package:*, dir/... vb.

Gökyüzü sorgusu

Sky Query, belirli bir evren kapsam üzerinde çalışan bir sorgu modudur.

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

Gökyüzü Sorgusu modunda allrdeps ve rbuildfiles ek sorgu işlevleri bulunur. Bu işlevler tüm evren kapsamında çalışır (bu nedenle normal Sorgu için bir anlam ifade etmezler).

Evreni bir kapsam belirleme

Gökyüzü Sorgusu modu, şu iki işaretin iletilerek 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. Daha sonra tüm sorgular bu "kapsama" göre değerlendirilir. Özellikle, allrdeps ve rbuildfiles operatörleri yalnızca bu kapsamdan 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"] şeklindedir. Bu nedenle Bazel, bunu çağrıyla aynı şekilde değerlendirir:

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 öğesinin ters bağımlılıklarının hiçbiri yapı gereği evrende yoktur. Diğer yandan, şunları 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ı kullanan hedeflere geçişli olarak bazı dizinler altındaki hedeflerin tests genişletmesinde test hedeflerini hesaplamaya çalışan anlamlı bir sorgu çağrısıdır. Bu örnekte --infer_universe_scope, özellikle --universe_scope seçiminin sorgu ifadesini kendiniz ayrıştırmanızı gerektireceği durumlarda kolaylık sağlamaktadır.

Bu nedenle, allrdeps ve rbuildfiles gibi evreni kapsamlı operatörler kullanan sorgu ifadelerinde --infer_universe_scope'u yalnızca davranışının istediğiniz gibi olması durumunda kullandığınızdan emin olun.

Sky Query'nin, varsayılan sorguyla karşılaştırıldığında bazı avantajları ve dezavantajları vardır. Ana dezavantajı, çıktısını grafik sırasına göre sıralayamaması ve bu nedenle belirli çıktı biçimlerinin yasaklanmasıdı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. Dolayısıyla, ekibinizin daha hızlı olduğu ve daha az bellek kullandığı bazı durumlar da vardır.

İfadeler: Dilbilgisinin söz dizimi ve anlamı

EBNF biçiminde ifade edilen Bazel sorgu dilinin dil bilgisi şöyledir:

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 dilbilgisinin tüm üretimleri sırayla açıklanmaktadır.

Hedef kalıpları

expr ::= word

Sözdizimsel olarak hedef kalıbı 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ı, etiketleri paketlere ve hedeflere joker karakterler dahil edecek şekilde 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ında bulunan her paketteki tüm hedefleri (kurallar ve dosyaları) içeren bir küme olarak değerlendirilen bir hedef kalıptır. bar/baz:* ise bar/baz paketindeki tüm hedefleri içeren ancak alt paketlerini içermeyen bir küme olarak değerlendirilir.

:* joker karakteri, kuralların yanı sıra dosyalarla da eşleştiğinden, sorgular için :all karakterinden genellikle 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 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ı, bir tekil küme (etiket söz konusu olduğunda), çok sayıda öğe içeren bir küme (binlerce öğesi olan foo/...'de olduğu gibi) ya da hedef kalıp hiçbir hedefle eşleşmiyorsa boş küme olarak değerlendirilebilir.

Bir hedef kalıbı 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ıyla ilgili 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 bu 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.

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

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şkeni tanımlar, ancak bunları iç içe yerleştirebilirsiniz.

Hem hedef kalıpları hem de değişken referansları tek bir jetondan veya kelimeden oluşur. Bu durum, söz dizimsel bir belirsizlik oluşturur. Ancak, yasal değişken adı olan kelimelerin alt kümesi, yasal hedef kalıpları olan kelimeler alt kümesinden ayrıldığı için anlamsal bir 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, birçok sorgunun daha kısa ve öz olmasını sağlar ve sorgu değerlendirmesinin daha verimli olmasını sağlayabilir.

Parantez içindeki 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, bütünleşme, fark belirleme

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 yerine normal set 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çimler daha hızlı yazılı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 değerlendirir.

Aynı sorguyu şu şekilde yazabilirsiniz:

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

intersect (^) ve union (+) işlemleri değişmeli (simetrik); 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 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: 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ği ile birlikte set(), bir sorgunun sonuçlarını normal bir metin dosyasına kaydetmek, bu metin dosyasını diğer programlar (standart UNIX kabuk araçları gibi) kullanarak değiştirmek ve daha sonra daha fazla işlem yapmak için sonucu sorgu aracına tekrar sunmak anlamına gelir. Örneğin:

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

Bir sonraki örnekte kind(cc_library, deps(//some_dir/foo:main, 5)),bir awk programı kullanılarak maxrank değerleri filtrelenerek 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) 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 birkaç işlevi 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ü, 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üne dayanan 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. Dolayısıyla bu hedefleri oluşturmak için gereken BUILD ve Starlark dosyaları buraya dahil edilmemiştir. 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ü, aramanın derinliği için üst sınırı belirten tam sayı olan isteğe bağlı ikinci bağımsız değişkeni kabul eder. Dolayısıyla deps(foo:*, 0), foo paketindeki tüm hedefleri döndürürken deps(foo:*, 1) ayrıca foo paketindeki herhangi bir hedefin doğrudan ön koşullarını içerir ve deps(foo:*, 2) ayrıca deps(foo:*, 1) içindeki düğümlerden doğrudan erişilebilen düğümleri içerir. (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 esnek 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ü, evren kümesinin geçişli kapanışı içinde x bağımsız değişkeni grubunun ters bağımlılıklarını u belirler.

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

rdeps operatörü, aramanın derinliği için üst sınırı belirten tam sayı olan isteğe bağlı üçüncü bağımsız değişkeni kabul eder. Sonuçta ortaya çıkan grafik, yalnızca bağımsız değişken grubundaki herhangi bir düğümden belirtilen derinliğe kadar olan mesafedeki düğümleri içerir. Dolayısıyla rdeps(//foo, //common, 1), doğrudan //common öğesine bağlı olan //foo öğesinin geçişli kapanmasındaki 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. 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/... geçildiyse allrdeps(//bar), rdeps(//foo/..., //bar) ile eşdeğerdir.

Aynı paketteki doğrudan ters bağımlılıklar: Aynı_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.

Bir hedefin paketiyle başa çıkma: kardeşler

expr ::= siblings(expr)

siblings(x) operatörü, bağımsız değişken grubundaki bir hedef olarak aynı pakette olan hedef kümesinin 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ş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. Eksik olursa sonuç, rastgele seçilmiş tek bir hedef içeren bir tekil 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 içeren bir singleton kümesi olarak değerlendirilir ancak bu küme tanımlanmamıştır. 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 sayıysa some, kimlik işlevini hesaplar: some(//foo:main), //foo:main öğesine 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 başlangıç noktası olarak S ve bitiş noktası grubu olmak üzere iki bağımsız değişkeni kabul eder.E somepath, S bölgesindeki bir hedeften E bölgesindeki hedefe giden bazı rastgele bir yol üzerinde bulunan düğümlerin grafiğini döndürür. allpaths, S bölgesindeki herhangi bir hedeften alınan tüm yollardaki düğümlerin grafiğini E bölgesindeki herhangi bir hedefe 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.

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 filtreleme: 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şleştirileceğini 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österilmiştir:

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

Bu nedenle kind("cc_.* rule", foo/...), foo altındaki tüm cc_library, cc_binary vb. kural hedeflerini, 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ı grubunu 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 için eşleşirken :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 siler; girişin 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ümeye 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 sağlam bir alternatif sunar. Örneğin, //foo:foo hedefinin tüm bar bağımlılıklarını görmek için şunları 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ştır ve alakasız BUILD dosyalarında hatalara açıktır. Bir alternatif şöyle olabilir:

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

Bu işlem önce //foo bağımlılıkları kümesini hesaplar, daha sonra yalnızca sağlanan kalıpla eşleşen hedefleri filtreler. Diğer bir deyişle, adlarında alt dize olarak //bar bulunan hedefleri filtreler.

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

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

//foo öğesini oluşturmak için kullanılan tüm .cc dosyalarının bir listesini sağlar.

Kural özelliği filtreleme: attr

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

attr(name, pattern, input) operatörü, bir dizi hedefe filtre uygular ve kural olmayan hedefleri, name özelliğinin tanımlı olmadığı kural hedeflerini veya özellik değerinin sağlanan normal ifadeyle pattern eşleşmediği kural hedeflerini siler. Girişin 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 olan pattern, özellik değerleri üzerindeki normal ifadedir. Bir attr ifadesi, tüm hedefleri içeren bir küme olarak değerlendirilir. Burada x, input grubunun üyesi, name olarak tanımlanan name özelliğine sahip bir kural ve özellik değeri pattern normal ifadesi için (bağlanmamış) eşleşme içerir.x 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))

linkshared özelliğine (cc_binary kuralı gibi) sahip olmasına izin verilen tüm //foo bağımlılıklarını seçer ve bunu açıkça 0 olarak ayarlar ya da hiç ayarlamaz ancak varsayılan değer 0'dır (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] dizesine 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))

boş bir srcs özelliğine sahip //foo bağımlılık arasındaki 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 işe yarar, çünkü value karakterinden önceki karakter [ veya boşluk, value karakterinden sonraki karakter virgül ya da ] olacaktır.

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

expr ::= visible(expr, expr)

visible(predicate, input) operatörü, bir dizi hedefe bir 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 grubudur. Bir visible ifadesi, tüm x hedeflerini içeren kümeye değerlendirilir. Böylelikle x, grubunun üyesi olur ve x predicate içindeki tüm hedefler y, y tarafından görülebilir.input Örneğin:

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

görünürlük kısıtlamalarını ihlal etmeden //foo paketinin dayanabileceği tüm hedefleri seçer.//bar

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

expr ::= labels(word, expr)

labels(attr_name, inputs) operatörü, inputs kümesindeki bir kuraldaki "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 kümesindeki tüm test kuralları grubunu döndürür, tüm test_suite kurallarını başvurdukları bağımsız testler kümesine genişletir ve tag ile size ölçütlerine göre filtreleme uygular.

Sorgu değerlendirme, varsayılan olarak tüm test_suite kurallarındaki test dışı hedefleri yoksayar. Bu, --strict_test_suite seçeneğiyle 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 başvurulan diğer paketlere ait testleri de kapsayabilir.

Paket tanımı dosyaları: buildfiles

expr ::= buildfiles(expr)

buildfiles(x) operatörü, x kümesindeki her bir hedefin paketlerini tanımlayan dosya grubunu, yani her bir paketin BUILD dosyasını ve load aracılığıyla referans verdiği tüm .bzl dosyalarını döndürür. Bu işlemin, bu load içeren paketleri 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 ve genellikle aşağıdaki --output package seçeneğiyle birlikte kullanılır. Ö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ğımlı 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 hedefini ve //bar:file.bzl yükleyen diğer BUILD dosyalarının hedeflerini döndürür.

rbuildfiles operatörünün kapsamı, --universe_scope işaretiyle belirtilen evrendir. Doğrudan BUILD dosyalarına 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 belirtilseler bile yoksayılır. Ancak sembol bağlantılara uyulur. Dolayısıyla foo/BUILD, bar/BUILD ile sembolik bağlantıysa rbuildfiles(bar/BUILD) sonuçları //foo:BUILD ifadesini içerir.

rbuildfiles operatörü, ahlaki açıdan buildfiles operatörünün 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önden ise yazışmalar daha zayıftır. buildfiles operatörünün çıkışları, tüm paketlere ve .bzl dosyası gerekiyor. 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ı: loadfiles

expr ::= loadfiles(expr)

loadfiles(x) operatörü, x kümesindeki her hedefin paketini yüklemek için gereken Starlark dosyaları kümesini 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 tarafından bu grafiği sunmak için kullanılan içeriği, biçimi ve sıralamayı --output komut satırı seçeneğini kullanarak belirtirsiniz.

Sky Query ile çalışırken yalnızca sırasız çıkışla uyumlu olan çı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ı hakkında

Sorgu ifadeleri her zaman "grafik sırasının korunumu yasası"na uygun olsa da sonuçların sunulması, bağımlılıklı veya sırasız bir şekilde yapılabilir. Bu, sonuç kümesindeki hedefleri veya sorgunun nasıl hesaplandığını etkilemez. Yalnızca sonuçların stdout'a nasıl yazdırılacağını 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 kullanımdan kaldırılmıştır.)

Bu işaretin varsayılan değeri auto şeklindedir ve sonuçları sözlüksel sıralama ile 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 ve --output şunlardan biri olduğunda build, label, label_kind, location, package, proto veya xml, çıkışlar rastgele yazdırılır. Bu genellikle en hızlı seçenektir. Ancak --output değeri graph, minrank veya maxrank değerlerinden biri olduğunda desteklenmez: Bu biçimlerde, Bazel her zaman bağımlılık sırasına veya sıralamasına göre sıralanmış sonuçları yazdırır.

Bu işaret deps olduğunda Bazel baskıları bir topolojik sıralamayla, yani bağımlılıklarla başlar. Bununla birlikte, bağımlılık sırasına göre sıralanmamış düğümler (ikisinden diğerine giden bir yol olmadığından) herhangi bir sırada yazdırılabilir.

Bu işaret full olduğunda Bazel, düğümleri tamamen deterministik (toplam) sırayla yazdırır. İlk olarak, tüm düğümler alfabetik olarak sıralanır. Daha sonra listedeki her bir düğüm, ziyaret edilmemiş düğümlere giden kenarların alfabetik olarak sıradaki düğümlerin tanıtıldığı bir sipariş sonrası derinlik öncelikli aramanın başlangıcı olarak kullanılır. Son olarak, düğümler ziyaret edildikleri sıranın tersi yönde yazdırılır.

Düğümleri bu sırada yazdırma işlemi daha yavaş olabilir. Bu nedenle, yalnızca determinizm önemli olduğunda kullanılmalıdır.

Hedeflerin kaynak biçimini BUILD'da görünecekleri şekilde yazdırın

--output build

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

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

--output label

Bu seçenekle, elde edilen grafikteki her bir hedefin ad (veya etiket) grubu, topolojik sırayla her satıra bir etiket gelecek şekilde yazdırılır (--noorder_results belirtilmediği sürece sonuçların sıralaması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 olası topolojik sıralaması vardır (ters postorder yalnızca bir tanesidir); hangisinin seçili olmadığı belirtilmemiştir.

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

Uyarı: Bazı durumlarda, aynı etikete sahip iki farklı hedef olabilir. Örneğin, bir sh_binary kuralı ve tek (dolaylı) srcs dosyası foo.sh olarak çağrılabilir. Bir sorgunun 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ılırken fark netleşir: İki hedef aynı ada sahiptir ancak birinin türü sh_binary rule, diğer türü ise source file olacaktır.

--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 arabelleklerinin uzunluk sınırlandırılmış akışını yazdırır. Bu, tek bir QueryResult'e sığmayacak kadar çok hedef olduğunda (i) protokol arabelleklerindeki boyut sınırlamalarını aşmak veya Bazel çıkış yaparken işlemenin başlatılabilmesi (ii) açısından faydalıdır.

--output textproto

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

--output streamed_jsonproto

--output streamed_proto işlevine benzer şekilde, Target protokol arabelleklerinden oluşan bir akışı 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ırada görünmek yerine sıralama numarasından önce gelen sırada görünür. Bunlar, sonuç sıralama --[no]order_results işaretinden etkilenmez (sonuçların sıralamasıyla ilgili notlara bakın).

Bu biçimin iki varyantı vardır: minrank her düğümü, bir kök düğümden ona giden en kısa yolun uzunluğuna göre sıralar. "Kök" düğümler (gelen kenarları olmayanlar) 0, sonrakileri ise 1. sıradadır vb. (Her zaman olduğu gibi kenarlar, bir hedefin ön koşullarına işaret eder: hedeflerin bağımlı olduğu hedefler.)

maxrank her düğümü, bir kök düğümden ona 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üğümlerin maksimum sıralamasından bir fazladır.

Bir döngüdeki tüm düğümlerin eşit sırada olduğu kabul edilir. (Çoğu grafik döngüseldir, ancak BUILD dosyaları hatalı döngüler içerdiği için döngüler kolayca gerçekleşir.)

Bu çıkış biçimleri, bir grafiğin ne kadar derin olduğunu keşfetmek için yararlıdır. deps(x), rdeps(x) veya allpaths sorgusunun sonucu için kullanılıyorsa sıralama numarası, x ile bu sıralamadaki bir düğüm arasındaki en kısa (minrank ile) yolun uzunluğuna eşittir.maxrank maxrank, bir hedef oluşturmak için gereken en uzun derleme adımı dizisini belirlemek amacıyla kullanılabilir.

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

Sıralamanın 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 çıkışına benzemektedir. Böylece, ikincisini (Emacs veya vi gibi) ayrıştırabilen araçlar, bir dizi eşleşme arasında gezinmek için sorgu çıkışını da kullanabilir. Böylece, Bazel sorgu aracı, bağımlılık grafiğine duyarlı "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 bildiriminin BUILD dosyasındaki 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 her durumda, henüz bir derleme gerçekleştirilmemişse mevcut 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ırasına göre yazılır; kopyalar hariç tutulur. Resmî olarak bu, etiket grubundan (paket, hedef) paketlere uygulanan 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öster

--output graph

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

Bu çıkış biçimi özellikle allpaths, deps veya rdeps sorguları için kullanışlıdır. Sonuçta, --output label gibi doğrusal bir formda işlendiğinde kolayca görselleştirilemeyen bir yol grubu bulunur.

Varsayılan olarak, grafik faktörlü bir biçimde oluşturulur. Yani topolojik olarak eşdeğer olan düğümler, birden çok etikete sahip tek bir düğüm halinde birleştirilir. Tipik sonuç grafikleri yüksek oranda tekrar eden kalıplar içerdiğinden, grafiği daha küçük ve okunabilir 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. Faktörlü grafikte bu dosyaların tamamı tek bir düğümle temsil edilir. Bu çalışma biçimi, --nograph:factored seçeneği ile 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. Uzun etiketler kısaltılır; -1 değeri ise 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 1024 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 dikkate alınmadan yazdırılır. Bu, GraphViz'i kullanarak görselleştirmeyi pratik hale getirir ancak daha basit biçim, diğer araçlar (grep gibi) 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, sonuçta elde edilen hedeflerin XML biçiminde yazdırılmasına neden olur. Çıkış şuna benzer bir XML üstbilgisiyle başlar:

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

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

</query>

Basit girişler file türündeki hedefler için 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 kuralın tüm özelliklerinin tanımlarını içerir. Buna, değeri kuralın BUILD dosyasında açıkça belirtilmeyenler de dahildir.

Buna ek olarak, sonuçta rule-input ve rule-output öğeleri de bulunur. Böylece bağımlılık grafiği topolojisi, örneğin srcs özelliğindeki öğelerin ileriye yönelik bağımlılık (ön koşullar) ve outs özelliğinin içeriklerinin geriye dönük bağımlılıklar (tüketiciler) 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 hedefin her XML öğesi, değeri hedefin etiketi olan bir name özelliği ve değeri, --output location tarafından yazdırılan hedef 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

Varsayılan olarak, XML çıkışı, değeri söz konusu özelliğin varsayılan değeri olan kural özelliğini içermez (örneğin, BUILD dosyasında belirtilmemişse veya varsayılan değer açıkça sağlanmışsa). Bu seçenek, bu tür özellik değerlerinin XML çıkışına eklenmesine neden olur.

Normal ifadeler

Sorgu dilindeki normal ifadeler, Java normal ifade kitaplığını kullanır. Böylece java.util.regex.Pattern için tüm 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 öğesine 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 için bağımlılık olarak listelenir.

Harici depoların kendisi bir derlemenin bağımlılığı 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