Bazel Sorgu Referansı

Sorun bildir Kaynağı görüntüle Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

Ek sorgu referansı

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

İşlem grafiği sorgusu

İşlem grafiği sorgusu (aquery), analiz sonrası yapılandırılmış hedef grafikte çalışır ve işlemler, yapılar ve bunların ilişkileri hakkında bilgi verir. aquery, Yapılandırılmış Hedef Grafiği'nden oluşturulan İşlemlerin/Yapıların özellikleriyle ilgilendiğinizde kullanışlıdır. Örneğin, çalıştırılan gerçek komutlar ile bunların girişleri, çıkışları ve anımsatıcıları.

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

Yapılandırılabilir sorgu

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

Daha fazla bilgi için cquery referansına 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'e bağlıdır? Yol gösterme:

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

What C++ libraries do all the foo tests depend on that the foo_bin target does not?

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

Jetonlar: Sözcüksel 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:

  • "foo/...", ".*test rule" veya "//bar/baz:all" gibi kelimeler. Bir karakter dizisi "alıntı" ise (tek tırnak ' ile başlayıp tek tırnak ' ile bitiyorsa veya çift tırnak " ile başlayıp çift tırnak " ile bitiyorsa) kelime olarak kabul edilir. Bir karakter dizisi tırnak içine alınmamışsa yine de kelime olarak ayrıştırılabilir. Tırnak içine alınmamış kelimeler, alfabedeki A-Z ve a-z karakterleri, 0-9 rakamları ve özel karakterler */@.-_:$~[] (yıldız, eğik çizgi, @, nokta, tire, alt çizgi, iki nokta üst üste, dolar işareti, yaklaşık işareti, sol köşeli ayraç, sağ köşeli ayraç) kullanılarak oluşturulan karakter dizileridir. Ancak göreli [hedef adları][(/concepts/labels#target-names) bu karakterlerle başlayabilse de tırnak içine alınmamış kelimeler kısa çizgi - veya yıldız * ile başlayamaz.

    Hedef adlarında bu karakterlere izin verilse de tırnak işareti içine alınmamış kelimeler artı işareti + veya eşittir işaretini = içeremez. Sorgu ifadeleri oluşturan kod yazarken 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 gerektirebileceği 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.

    Tırnak içine alınan anahtar kelimeler normal kelimeler gibi değerlendirilir. Örneğin, some bir anahtar kelime, "bazı" ise 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ı alıntılarken yalnızca bir tırnak türü kullanın (ya tek ya da çift tırnak).

    Java sorgu dizesinin nasıl olacağına dair örnekleri aşağıda bulabilirsiniz:

      '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 duyulmaması için bu söz dizimini seçtik. ".*test rule" (Alışılmadık) örnekte tırnak işareti kullanılması gerekir: Nokta ile başlıyor ve boşluk içeriyor. "cc_library" alıntısı gereksiz ancak zararsızdır.

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

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

Bazel sorgu dili kavramları

Bazel sorgu dili, ifadelerden oluşan bir dildir. Her ifade, hedeflerin kısmen sıralı kümesi veya eşdeğer olarak hedeflerin grafiği (DAG) olarak değerlendirilir. Tek veri türü budur.

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

  • Küme: Hedeflerin kısmi sırası önemli değildir.
  • Grafik: Hedeflerin kısmi sırası önemlidir.

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

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

Sorgu dili tarafından kullanılan algoritmalar, döngüsüz grafiklerde kullanılmak üzere tasarlanmıştır ancak döngülere karşı dayanıklıdır. Döngülerin nasıl ele alındığıyla 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 derleme bağımlılıklarına ek olarak kurallara örtülü bağımlılıklar da ekler. Örneğin, her Java kuralı JavaBuilder'a örtülü olarak bağlıdır. Örtülü 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 sonucu hesaplanırken ö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 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 bildirimleriyle örtülü olarak tanımlanan grafik olan derleme bağımlılığı grafiği üzerinde çalışır. Bu grafiğin biraz soyut olduğunu ve derlemenin tüm adımlarının nasıl gerçekleştirileceğine dair eksiksiz bir açıklama içermediğini anlamak önemlidir. Derleme işleminin gerçekleştirilmesi 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 ifadeyi değerlendirmenin sonucu tüm yapılandırmalar için doğrudur. Bu da sonucun, tam olarak doğru olmasa da muhafazakar bir fazla 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ı, örneğin, derlemenizde bu özelliği kullanmayı planlamadığınız halde ileti çevirisini desteklemek için gereken tüm dosyaları dahil edeceğinden, gerekenden daha fazla dosya bildirebilir.

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

İşlemler, alt ifadelerinden devralınan sıralama kısıtlamalarını korur. Bunu "kısmi sıralamanın korunumu yasası" olarak düşünebilirsiniz. Örneğin, belirli bir hedefin bağımlılıklarının geçişli kapanımını belirlemek için bir sorgu gönderdiğinizi varsayalım. Sonuçta elde edilen küme, bağımlılık grafiğine göre sıralanır. Bu grubu yalnızca file türündeki hedefleri içerecek şekilde filtrelerseniz, sonuçta elde edilen alt kümedeki her hedef çifti arasında aynı geçişli kısmi sıralama ilişkisi geçerli olur. Bu çiftlerin hiçbiri orijinal grafikte doğrudan bağlı olmasa bile. (Derleme bağımlılığı grafiğinde dosya-dosya kenarları yoktur.)

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

deps(x) union y

Sonuç kümesinin sırası, alt ifadelerinin tüm sıralama kısıtlamalarını koruyacak şekilde belirlenir. Yani, x öğesinin tüm geçişli bağımlılıkları birbirine göre doğru şekilde sıralanır. Ancak sorgu, y içindeki hedeflerin sıralaması veya deps(x) içindeki hedeflerin y içindeki hedeflere göre sıralaması (y içinde olup deps(x) içinde de bulunan hedefler hariç) hakkında hiçbir garanti vermez.

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

Sky sorgusu

Sky Query, 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, evrenin tamamı üzerinde çalışır (bu nedenle normal sorgu için anlamlı değildir).

Evren kapsamı belirtme

Gökyüzü sorgusu modu, aşağıdaki iki işaret 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ımını önceden yüklemesini söyler. Bu, hem toplama hem de çıkarma işlemi olabilir. Tüm sorgular daha sonra 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 --universe_scope için sorgu ifadesinden bir değer çıkarılmasını söyler. Bu çıkarılan değer, sorgu ifadesindeki benzersiz hedef kalıpların listesidir ancak bu, istediğiniz değer 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 şu çağırma ile aynı şekilde ele alır:

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

Ancak --universe_scope ile yapılan sorgunun sonucu yalnızca //my:target'dir. //my:target'nin ters bağımlılıklarının hiçbiri, yapı gereği evrende yer almaz. 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ını kullanan hedeflere geçişli olarak bağlı olan bazı dizinlerdeki hedeflerin tests genişletmesinde test hedeflerini hesaplamaya çalışan anlamlı bir sorgu çağrısıdır. Burada, --infer_universe_scope özellikle seçimin --universe_scope sorgu ifadesini kendiniz ayrıştırmanızı gerektireceği durumlarda kolaylık sağlar.

Bu nedenle, evren kapsamlı operatörler (ör. allrdeps ve rbuildfiles) kullanan sorgu ifadelerinde --infer_universe_scope operatörünü yalnızca istediğiniz şekilde davrandığından emin olduğunuzda kullanın.

Sky Query'nin varsayılan sorguya kıyasla bazı avantajları ve dezavantajları vardır. Bu yöntemin temel dezavantajı, çıktısını grafik sırasına göre sıralayamaması ve bu nedenle belirli çıktı biçimlerinin yasaklanmasıdır. Avantajı, varsayılan sorguda bulunmayan iki operatör (allrdeps ve rbuildfiles) sağlamasıdır. Ayrıca Sky Query, varsayılan uygulamanın yaptığı gibi yeni bir grafik oluşturmak yerine Skyframe grafiğini inceleyerek çalışır. Bu nedenle, bazı durumlarda daha hızlıdır ve daha az bellek kullanır.

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

Bu, Bazel sorgu dilinin EBNF gösterimiyle 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 dilbilgisinin her bir üretimi sırayla açıklanmaktadır.

Hedef kalıpları

expr ::= word

Sözdizimsel olarak, hedef kalıp yalnızca bir kelimedir. Hedeflerin (sırasız) bir grubu olarak yorumlanır. En basit hedef kalıbı, tek bir hedefi (dosya veya kural) tanımlayan bir etikettir. Örneğin, hedef kalıbı //foo:bar, bir öğe (hedef) içeren bir kümeye, bar kuralına göre değerlendirilir.

Hedef kalıpları, paketler ve hedefler üzerinde joker karakterler içerecek şekilde etiketleri genelleştirir. Örneğin, foo/...:all (veya yalnızca foo/...), foo dizininin altında her paketteki tüm kuralları içeren bir kümeye 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ümeye değerlendirilen bir hedef kalıptır.

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

:* joker karakteri hem dosyalarla hem de kurallarla eşleştiğinden sorgular için genellikle :all karakterinden daha kullanışlıdır. Buna karşılık, :all joker karakteri (foo/... gibi hedef desenlerde örtülü olarak bulunur) genellikle derlemeler için daha kullanışlıdır.

bazel query hedef kalıpları, bazel build derleme hedefleriyle aynı şekilde çalışır. Daha fazla bilgi için Hedef Kalıpları başlıklı makaleyi inceleyin veya bazel help target-syntax yazın.

Hedef kalıplar, tek öğeli bir kümeye (etiket durumunda), çok sayıda öğe içeren bir kümeye (binlerce öğesi olan foo/... durumunda) veya hedef kalıp hiçbir hedefle eşleşmezse boş kümeye dönüşebilir.

Hedef kalıp ifadesinin sonucundaki tüm düğümler, bağımlılık ilişkisine göre birbirlerine göre doğru şekilde sıralanır. Bu nedenle, foo:* sonucunda yalnızca foo paketindeki hedefler kümesi değil, aynı zamanda bu hedefler üzerindeki grafik de yer alır. (Sonuç düğümlerinin diğer düğümlere göre 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 bunlara referans verilmesine olanak tanır. Bir let ifadesinin değerlendirilmesinin sonucu, expr2 ifadesinin sonucuyla aynıdır. Bu durumda, name değişkeninin tüm serbest oluşumları, expr1 değerleriyle değiştirilir.

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

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

Yukarıdaki dil bilgisi üretimlerinde name, word gibidir ancak C programlama dilinde yasal bir tanımlayıcı olması ek kısıtlaması vardır. Değişkene yapılan referansların önüne "$" 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 dizimsel belirsizlik yaratır. Ancak, yasal değişken adları olan kelimelerin alt kümesi, yasal hedef kalıpları olan kelimelerin alt kümesinden ayrı olduğu için anlamsal belirsizlik yoktur.

Teknik olarak, let ifadeleri sorgu dilinin ifade gücünü artırmaz: Dilde ifade edilebilen tüm sorgular, bu ifadeler olmadan da ifade edilebilir. Ancak bu yanıtlar birçok sorgunun kısa ve öz olmasını sağlar ve sorguların daha verimli şekilde değerlendirilmesine de yol açabilir.

Parantezli ifadeler

expr ::= (expr)

Parantezler, değerlendirme sırasını zorlamak için alt ifadeleri ilişkilendirir. Parantez içine alınmış bir ifade, bağımsız değişkeninin değerini verir.

Cebirsel küme işlemleri: kesişim, birleşim, 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 biçim ve ^ gibi sembolik biçim. Her iki form da eşdeğerdir. Sembolik formlar daha hızlı yazılır. (Anlaşılırlık için bu sayfanın geri kalanında ad biçimleri kullanılmaktadı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şme özelliğine (simetrik) sahiptir. except (-) ise asimetriktir. Ayrıştırıcı, üç operatörün tümünü soldan birleşmeli ve eşit öncelikli olarak değerlendirir. Bu nedenle, parantez kullanmak isteyebilirsiniz. Örneğin, bu ifadelerin 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 hedefleri okuma: ayarlandı

expr ::= set(word *)

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

set(), Bourne kabuğunun $(...) özelliğiyle birlikte, bir sorgunun sonuçlarını normal bir metin dosyasına kaydetme, bu metin dosyasını diğer programları (ör. standart UNIX kabuk araçları) kullanarak değiştirme ve ardından sonucu daha fazla işlenmek üzere sorgu aracına değer olarak geri aktarma olanağı sağlar. Ö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)) değeri, awk programı kullanılarak maxrank değerleri 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) için kısaltma olarak kullanılmıştı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ın geçişli kapanması: deps

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

deps(x) operatörü, bağımsız değişken kümesi x'nin bağımlılıklarının geçişli kapanmasıyla oluşan grafiği değerlendirir. Örneğin, deps(//foo) değerinin, tüm bağımlılıkları dahil olmak üzere tek bir düğüm olan foo'de köklenen bağımlılık grafiği olduğu varsayılır. deps(foo/...) değerini, kökleri foo dizininin altındaki her paketteki tüm kurallar olan bağımlılık grafikleri oluşturur. 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.

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.

deps operatörü, arama derinliğinin üst sınırını belirten isteğe bağlı bir ikinci bağımsız değişkeni (tam sayı değişmezi) kabul eder. Bu nedenle, 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)'deki düğümlerden doğrudan erişilebilen düğümleri de içerir. (Bu sayılar, minrank çıkış biçiminde gösterilen sıralara karşılık gelir.) depth parametresi atlanırsa arama sınırsız olur: Ön koşulların yansıtıcı geçişli kapanımını hesaplar.

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

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

rdeps(u, x) işleci, evren kümesinin geçişli kapanımı içindeki bağımsız değişken kümesinin x ters bağımlılıklarını u olarak değerlendirir.

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ü, arama derinliğinin üst sınırını belirten bir tam sayı değişmezi olan isteğe bağlı üçüncü bir bağımsız değişkeni kabul eder. Sonuçta elde edilen grafik yalnızca bağımsız değişken kümesindeki herhangi bir düğümden belirtilen derinlik mesafesinde bulunan düğümleri içerir. Bu nedenle rdeps(//foo, //common, 1), //common öğesine doğrudan bağlı olan //foo öğesinin geçişli kapanımındaki 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ız olur.

Tüm ters bağımlılıkların geçişli kapanımı: allrdeps

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

allrdeps operatörü, rdeps operatörüyle aynı şekilde çalışır. Ancak "evren kümesi", ayrı olarak belirtilmek yerine --universe_scope işaretinin değerlendirildiği değerdir. Bu nedenle, --universe_scope=//foo/... iletilirse 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 hedefle aynı pakette bulunan ve doğrudan bu hedefe bağlı olan hedeflerin tamamını değerlendirir.

Hedefin paketiyle (kardeşler) ilgilenme

expr ::= siblings(expr)

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

Keyfi seçim: Bazı

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

some(x, k) operatörü, bağımsız değişken kümesi x içinden en fazla k hedefi rastgele seçer ve yalnızca bu hedefleri içeren bir kümeye dönüşür. Parametre k isteğe bağlıdır. Eksikse sonuç, rastgele seçilmiş tek bir hedef içeren tek öğeli bir küme olur. x bağımsız değişken kümesinin boyutu k bağımsız değişken kümesinden 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, hangisi olduğu tanımlanmamış olsa da //foo:main veya //bar:baz içeren tek öğeli bir kümeye değerlendirilir. 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 tekilse some kimlik işlevini hesaplar: some(//foo:main), //foo:main ile eşdeğerdir.

Belirtilen bağımsız değişken kümesi boşsa hata oluşur. Örneğin, some(//foo:main intersect //bar:baz) ifadesinde hata vardı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ıç noktaları kümesi S ve bir bitiş noktaları kümesi E. somepath, S içindeki bir hedeften E içindeki bir hedefe giden bazı rastgele yollardaki düğümlerin grafiğini döndürür. allpaths, S içindeki herhangi bir hedeften E içindeki 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 fazla bilgi için grafik sırası bölümüne bakın.

Somepath
somepath(S1 + S2, E), olası bir sonuç.
Somepath
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 kaldırır. pattern parametresi, hangi tür hedefle eşleşileceğini belirtir.

Örneğin, aşağıdaki 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 dosyası
//p:a.out oluşturulan dosya
//p:BUILD kaynak dosyası

Bu nedenle, kind("cc_.* rule", foo/...), foo altındaki tüm cc_library, cc_binary vb. kural hedeflerinin kümesi olarak değerlendirilir ve kind("source file", deps(//foo)), //foo hedefinin bağımlılıklarının geçişli kapanımındaki tüm kaynak dosyaların kümesi olarak değerlendirilir.

pattern bağımsız değişkeninin tırnak içine alınması genellikle gerekir. Çünkü bu 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ştirme yapılırken :all ile biten hedefler 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şinin bir alt kümesi olarak değerlendirilir.

İlk bağımsız değişken olan pattern, hedef adlar üzerinde normal ifade içeren bir kelimedir. Bir filter ifadesi, x öğesinin input kümesinin bir üyesi olduğu ve x öğesinin etiketi (//foo:bar gibi mutlak biçimde) pattern normal ifadesi için (bağlanmamış) bir eşleşme içerdiği tüm hedefleri içeren kümeyi değerlendirir.x Tüm hedef adları // ile başladığından, ^ normal ifade sabiti yerine kullanılabilir.

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

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

Ancak bu ifade, BUILD ağacındaki tüm BUILD dosyalarının ayrıştırılmasını gerektirecektir. Bu da yavaş ve alakasız BUILD dosyalarında hatalara açık olacaktır.bar Alternatif olarak:

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

Bu komut, önce //foo bağımlılıkları kümesini hesaplar, ardından yalnızca sağlanan kalıpla eşleşen hedefleri filtreler. Diğer bir deyişle, adlarında //bar alt dizesini içeren hedefleri filtreler.

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

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

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

Kural özelliği filtreleme: attr

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

attr(name, pattern, input) işleci bir hedef grubuna filtre uygular ve kural olmayan hedefleri, name özelliği tanımlanmamış kural hedeflerini veya özellik değerinin sağlanan pattern normal ifadesiyle eşleşmediği kural hedeflerini atar. Girişinin bir alt kümesi olarak değerlendirilir.

İ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 üzerinde bir düzenli ifadedir. Bir attr ifadesi, x kümesinin bir üyesi olan, tanımlanmış name özelliğine sahip bir kural olan ve özellik değeri pattern normal ifadesi için (bağlanmamış) bir eşleşme içeren tüm hedefleri içeren kümeyi değerlendirir.xinput name isteğe bağlı bir özellikse ve kuralda açıkça belirtilmemişse 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ını (ör. cc_binary kuralı) seçer ve bu bağımlılıkları açıkça 0 olarak ayarlar veya hiç ayarlamaz ancak varsayılan değer 0'dır (ör. cc_binary kuralları için).

Liste türündeki özellikler (ör. srcs, data vb.) [value<sub>1</sub>, ..., value<sub>n</sub>] biçimindeki dizelere dönüştürülür. Bu dizeler [ köşeli paranteziyle başlar, ] köşeli paranteziyle biter ve birden fazla değeri sınırlamak için "," (virgül, boşluk) kullanı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 mevcut olduğundan boş liste, eşleştirme amacıyla [] dize değerini kullanır. Örneğin,

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

, //foo bağımlılıkları arasındaki srcs özelliği boş olan tüm kuralları seçerken

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

, //foo bağımlılıkları arasında 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 ile //foo bağımlılıkları arasındaki tüm kuralları seçmek için

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

Bu, value karakterinden önceki karakter [ veya boşluk, value karakterinden sonraki karakter ise virgül veya ] olacağı için çalışır.

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.

İlk 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, x kümesinin bir üyesi olduğu ve predicate içindeki tüm hedefler y için x öğesinin y tarafından görülebildiği tüm hedefleri içeren kümeyi değerlendirir.xinput Örneğin:

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

görünürlük kısıtlamalarını ihlal etmeden //foo bağlı olabilecek //bar paketteki 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 kümesinde srcs özelliklerine sahip birden fazla kural varsa bunların srcs birleşimi döndürülür.

test_suites: tests öğesini genişletme ve filtreleme

expr ::= tests(expr)

tests(x) operatörü, x kümesindeki tüm test kuralları kümesini döndürür. test_suite kurallarını, atıfta bulundukları ayrı testler kümesine genişletir ve tag ile size'ye 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ğiyle hatalara dönüştürülebilir.

Ö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 üyesidir. 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ümesindeki her hedefin paketlerini tanımlayan dosyalar kümesini döndürür. Başka bir deyişle, her paket için BUILD dosyası ve load aracılığıyla referans verdiği tüm .bzl dosyaları. Bu işlemin, loaded dosyalarını içeren paketlerin BUILD dosyalarını da döndürdüğünü unutmayın.

Bu operatör, genellikle belirtilen bir hedefin oluşturulması için hangi dosyaların veya paketlerin gerekli olduğunu belirlerken (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 kümesini döndürür.

Paket tanımı dosyaları: rbuildfiles

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

rbuildfiles operatörü, virgülle ayrılmış bir yol parçaları listesi alır ve bu yol parçalarına geçişli olarak bağlı olan BUILD dosyaları kümesini 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. BUILD ve .bzl dosyalarıyla doğrudan eşleşmeyen dosyalar sonuçları etkilemez. Örneğin, kaynak dosyalar (foo.cc gibi) BUILD dosyasında açıkça belirtilmiş olsalar bile yoksayılır. Ancak sembolik bağlantılar dikkate alınır. Bu nedenle, foo/BUILD, bar/BUILD için sembolik bir bağlantıysa rbuildfiles(bar/BUILD), sonuçlarına //foo:BUILD öğesini dahil eder.

rbuildfiles operatörü, buildfiles operatörünün neredeyse ahlaki olarak tersidir. Ancak bu ahlaki tersine çevirme, tek bir yönde daha güçlü bir şekilde geçerlidir: rbuildfiles'nın çıkışları, buildfiles'nın girişlerine benzer. Birincisi, paketlerde yalnızca BUILD dosya hedeflerini içerir ve ikincisi bu tür hedefleri içerebilir. Diğer yönde ise bu yazışma 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ümesindeki her hedefin paketlerini yüklemek için gereken Starlark dosyaları kümesini döndürür. Başka bir deyişle, her paket için BUILD dosyalarından referans verilen .bzl dosyalarını döndürür.

Çıkış biçimleri

bazel query grafik oluşturur. bazel query komut satırı seçeneğini kullanarak bazel query'nın bu grafiği sunacağı içeriği, biçimi ve sırayı belirtirsiniz.--output

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.

Bazı çıkış biçimleri ek seçenekleri kabul eder. Her çıktı seçeneğinin adının önüne, geçerli olduğu çıktı biçimi eklenir. Bu nedenle, --graph:factored yalnızca --output=graph kullanılırken geçerlidir. graph dışında bir çıktı 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ıralanmasıyla ilgili

Sorgu ifadeleri her zaman "grafik sırasının korunumu yasasına" uysa da sonuçlar sunulurken bağımlılık sırasına göre veya sırasız olarak sunulabilir. Bu durum, sonuç kümesindeki hedefleri veya sorgunun nasıl hesaplandığını etkilemez. Bu yalnızca sonuçların stdout'a nasıl yazdırılacağını etkiler. Ayrıca, bağımlılık sırasına göre 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ümesine sahiptir ve desteği sonlandırılmıştır.)

Bu işaretin varsayılan değeri auto'dır. Bu değer, sonuçları sözlük sırasına göre 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 değerlerinden biri olduğunda çıkışlar rastgele sırada yazdırılır. Bu genellikle en hızlı seçenektir. Ancak --output, graph, minrank veya maxrank biçimlerinden biri olduğunda bu özellik desteklenmez. Bu biçimlerde Bazel, sonuçları her zaman bağımlılık sırasına veya sıralamaya göre sıralayarak 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ıralanmamış düğümler (çünkü birinden diğerine giden bir yol yoktur) herhangi bir sırada yazdırılabilir.

Bu işaret full olduğunda Bazel, düğümleri tamamen deterministik (toplam) bir sırada yazdırır. Öncelikle tüm düğümler alfabetik olarak sıralanır. Ardından, listedeki her düğüm, ziyaret edilmemiş düğümlere giden kenarların halef düğümlerin alfabetik sırasına göre geçildiği bir sıralı derinlik öncelikli aramanın başlangıcı olarak kullanılır. Son olarak, düğümler ziyaret edildikleri sıranın tersiyle yazdırılır.

Düğümleri 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ünecek şekilde yazdırın.

--output build

Bu seçenekte her hedef, BUILD dilinde elle yazılmış gibi gösterilir. 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ı veren 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şturacağı garanti edilmez.

--output label

Bu seçenekte, sonuçta elde edilen grafikteki her hedefin adları (veya etiketleri), her satırda bir etiket olacak şekilde, topolojik sırada (--noorder_results belirtilmediği sürece, sonuçların sıralanmasıyla ilgili notlar bölümüne bakın) yazdırılır. (Topolojik sıralama, bir grafikteki düğümün tüm haleflerinden önce göründüğü sıralamadır.) Elbette bir grafiğin birçok olası topolojik sıralaması vardır (ters sonrası sıralama bunlardan sadece biridir); hangisinin seçildiği belirtilmez.

somepathSorgu çıktısı yazdırılı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 (örtülü) srcs dosyası foo.sh olarak adlandırılabilir. Bir sorgunun sonucu bu hedeflerin her ikisini de içeriyorsa çıkış (label biçiminde) kopya içeriyormuş gibi görünür. label_kind (aşağıya bakın) biçimi kullanıldığında ayrım netleşir: İ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ç grafiğindeki her hedefin etiketlerini topolojik sırada yazdırır ancak etiketin önüne hedefin türünü de ekler.

--output minrank --output maxrank

label gibi, minrank ve maxrank çıkış biçimleri de sonuç grafiğinde her hedefin etiketlerini yazdırır ancak topolojik sırada görünmek yerine, sıralama numaralarıyla birlikte sıralama sırasına göre görünürler. 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, bunların halefleri 1. sıradadır vb. (Kenarlar her zaman bir hedeften ön koşullarına, yani bağlı olduğu hedeflere doğru 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ıralamasına sahiptir. Diğer tüm düğümler, tüm öncekilerin maksimum sıralamasından bir fazla sıralamaya sahiptir.

Bir döngüdeki tüm düğümler eşit sıralamaya sahip olarak kabul edilir. (Çoğu grafik döngüsüzdür ancak BUILD dosyaları hatalı döngüler içerdiğinden döngüler 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ıyorsa sıra numarası, x öğesinden o 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 derleme adımları dizisini belirlemek üzere kullanılabilir.

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

Daha yüksek sıralama
      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 hedef için hedefin türünü ve etiketini yazdırır ancak bu seçeneğin önüne, dosya adı ve satır numarası olarak hedefin konumunu açıklayan bir dize eklenir. Biçim, grep çıkışına benzer. Bu nedenle, ikincisini ayrıştırabilen araçlar (ör. Emacs veya vi), sorgu çıkışını bir dizi eşleşmeyi adım adım incelemek için de kullanabilir. Bu sayede Bazel sorgu aracı, bağımlılık grafiği konusunda bilgi sahibi bir "BUILD dosyaları için grep" olarak kullanılabilir.

Konum bilgileri hedef türüne göre değişir (kind operatörüne bakın). Kurallar için BUILD dosyasındaki kural bildiriminin konumu yazdırılır. Kaynak dosyalar için, 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ında, oluşturulan dosyanın gerçek konumunu bulmak için yeterli bilgi yoktur ve her durumda, henüz derleme yapılmamışsa dosya 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 yazdırılır ve yinelenenler hariç tutulur. Resmi olarak bu, etiketler (paket, hedef) kümesinden paketlere yönelik 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 grubunu oluşturmak için kullanıma alınması gereken paketler grubunu 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ş bir grafik olarak yazdırılmasına neden olur. Genellikle sonuç .png veya .svg gibi bir dosyaya kaydedilir. (dot programı iş istasyonunuza yüklenmemişse dot komutunu kullanarak yükleyebilirsiniz.) Örnek bir çağırma için aşağıdaki örnek bölümüne bakın.sudo apt-get install graphviz

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

Grafik varsayılan olarak çarpanlarına ayrılmış biçimde oluşturulur. Yani, topolojik olarak eşdeğer düğümler, birden fazla etikete sahip tek bir düğümde birleştirilir. Bu sayede, tipik sonuç grafiklerinde çok tekrarlayan desenler bulunduğundan grafik daha kompakt ve okunabilir hale gelir. Örneğin, bir java_library kuralı, aynı genrule tarafından oluşturulan yüzlerce Java kaynak dosyasına bağlı olabilir. Faktörlere ayrı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. Grafikler genellikle çarpanlarına ayrılmış biçimde yazdırıldığından 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 olmaz.

--[no]graph:factored

Varsayılan olarak grafikler, yukarıda açıklandığı gibi faktörlere ayrılmış biçimde gösterilir. --nograph:factored belirtildiğinde grafikler faktörleme yapılmadan yazdırılır. Bu durum, GraphViz kullanılarak görselleştirmeyi pratik olmaktan çıkarır ancak daha basit biçim, diğer araçlar (ör. grep) tarafından işlenmeyi kolaylaştırabilir. Bu seçenek, --output=graph kullanılmadığı sürece etkili olmaz.

XML

--output xml

Bu seçenek, sonuçta elde edilen hedeflerin XML biçiminde yazdırılmasına neden olur. Çıkış, şu 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ırasız sonuçlar istenmediği sürece) bir XML öğesiyle devam eder ve son olarak bir 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 değeri kuralın BUILD dosyasında açıkça belirtilmeyenler de dahil olmak üzere kuralın tüm özelliklerinin tanımlarını içerir.

Ayrıca, rule-input ve rule-output öğeleri de sonuçta yer alır. 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çeriklerinin geri bağımlılıklar (tüketiciler) olduğunu bilmeye gerek kalmadan yeniden oluşturulabilir.

--noimplicit_deps belirtilmişse örtülü bağımlılıklar için rule-input öğeleri gizlenir.

  <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

Varsayılan olarak, XML çıkışında gösterilen konumlar satır numaralarını içerir. --noxml:line_numbers belirtildiğinde satır numaraları yazdırılmaz.

--[no]xml:default_values

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

Normal ifadeler

Sorgu dilindeki normal ifadeler Java regex kitaplığını kullandığından java.util.regex.Pattern için tam söz dizimini kullanabilirsiniz.

Harici depolarla sorgulama

Derleme, harici depolardaki kurallara bağlıysa (WORKSPACE dosyasında tanımlanır) sorgu sonuçları bu bağımlılıkları içerir. Örneğin, //foo:bar, //external:some-lib öğesine bağlı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 öğesini bağımlı öğe olarak listeler.

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