Bazel Sorgu Referansı

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfa, kullanılan Bazel Sorgu Dili için başvuru kılavuzudur. derleme bağımlılıklarını analiz etmek için bazel query kullandığınızda Aynı zamanda bazel query tarafından desteklenen çıkış biçimlerini açıklar.

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'e ek olarak Bazel'da işlem grafiği sorgusu ve yapılandırılabilir sorgu bulunur.

İşlem grafiği sorgusu

İşlem grafiği sorgusu (aquery), analiz sonrası Yapılandırılmış Hedef Grafik ve İşlemler, Yapılar ve teşvik etmek anlamına gelir. aquery, aşağıdaki durumlarda faydalıdır: Yapılandırılmış Hedef Grafik'ten oluşturulan İşlemler/Yapıların özellikleri. Ö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ışır ve Dolayısıyla yapılandırma ve bunlarla ilişkili kavramlar gibi bir kavram yoktur. Özellikle, belirli ifadeleri doğru şekilde çözümlemiyorsa ve bunun yerine, seçimlerin olası tüm çözünürlüklerini döndürür. Ancak yapılandırılabilir sorgu ortamı, cquery, yapılandırmaları düzgün şekilde işler ancak anahtar kelimesi, 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 C++ kitaplıklarının yaptığı işlemler ve foo_bin hedefi hedeflemiyor mu?

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ğıdakilerden oluşur: jetonlar:

  • Anahtar kelimeler (ör. let). Anahtar kelimeler, dildir ve her biri aşağıda açıklanmıştır. Tüm set oranında anahtar kelime:

  • "foo/..." gibi kelimeler veya ".*test rule" veya "//bar/baz:all". karakter dizisi "tırnaklı" (tek tırnak ' ile başlar ve biter ' veya ile başlar ve biter çift tırnak "), bu bir kelimedir. Bir karakter dizisi alıntılanmaz, yine de kelime olarak ayrıştırılabilir. Tırnak işareti içinde olmayan kelimeler dizidir A-Za-z alfabe karakterlerinden, 0-9 arasındaki rakamlardan çizilmiş karakterlerden ve */@.-_:$~[] özel karakterleri (yıldız, eğik çizgi, at, nokta, kısa çizgi, alt çizgi, iki nokta üst üste, dolar işareti, tilde, sol köşeli ayraç, sağ kare ayraç). Ancak, tırnak içinde olmayan kelimeler kısa çizgiyle - veya yıldız işaretiyle * başlayamaz. göreceli hedef adları başlayabilir kullanmamız gerekecek.

    Tırnak işareti içinde olmayan kelimeler de artı işareti + veya eşittir karakterlerini içeremez. = işaretini kullanın. Zaman sorgu ifadeleri oluşturan kod yazıyorsa hedef adların tırnak içine alınması gerekir.

    Bazel sorgusu oluşturan komut dosyaları yazılırken alıntı yapılması gerekir ifadelerden kaçının.

     //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, söz konusu kaynakla ilgili tüm alıntıların kabuğunuzu anlatabilirsiniz. Ö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, anahtar kelime, ancak "bazı" bir kelimedir. Hem foo hem de "foo" kelimelerdir.

    Ancak hedef adlarda tek veya çift tırnak kullanırken dikkatli olun. Zaman bir veya birden fazla hedef isimden alıntı yaparken, yalnızca tek bir tırnak işareti kullanın (ya da hedef adların tek veya tüm çift tırnak).

    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. İlgili içeriği oluşturmak için kullanılan (olağan dışı) ".*test rule" örneği için tırnak işareti gerekiyor: Örnek bir noktayla başlar ve bir boşluk içeriyor. "cc_library" alanından alıntı yapmak gereksizdir ancak zararsızdır.

  • Noktalama işaretleri (ör. () parantezleri, .. nokta ve ,). Kelimeler tırnak işareti içeren noktalama işaretleri de (yukarıda belirtilen istisnalar hariç) tırnak içine alınmalıdır.

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. Hepsini ifade, kısmi olarak sıralı bir dizi hedef grubuna karşılık gelir. veya eşdeğer bir hedef grafiği (DAG) oluşturun. Sadece bu veri türü.

Küme ve grafik aynı veri türüne işaret eder, ancak farklı vurgular bazı önemli hususlara örnek verebiliriz:

  • 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ülere karşı dayanıklıdır. Projenin gidişatı boyunca döngüler belirtilmemiştir ve bunlara güvenilmemelidir.

Dolaylı bağımlılıklar

BUILD dosyalarında açık bir şekilde tanımlanan bağımlılıkları derlemeye ek olarak, Bazel, kurallara ek dolaylı bağımlılıklar ekler. Örneğin: tüm Java kuralları dolaylı olarak JavaBuilder'a bağlıdır. Dolaylı bağımlılıklar ile başlayan özellikler kullanılarak oluşturulur ve $ BUILD dosyada geçersiz kılınamaz.

Varsayılan olarak bazel query, örtülü bağımlılıkları dikkate alır ne olur? Bu davranış, aşağıdaki gibi değiştirilebilir: --[no]implicit_deps seçeneği. Sorgunun potansiyel araç zincirleri hiçbir zaman dikkate alınmaz.

Ses düzeyi

Bazel sorgu dili ifadeleri, derleme üzerinde çalışır bağımlılık grafiğidir. Bu grafik, BUILD dosyanın tamamında kural bildirimleri yer alıyor. İş yerindeki herhangi bir değişimden ve bu grafiğin biraz soyut olduğunu ve bir derlemenin tüm adımlarının nasıl gerçekleştirileceğinin tam açıklaması. İçinde bir yapılandırma da gerekir; yapılandırmaları bölümüne bakın.

Bazel sorgu dilindeki bir ifade değerlendirilmesinin sonucu tüm yapılandırmalar için geçerlidir, yani ihtiyatlı bir yaklaşımla tahmin edilir ve tam olarak kesin değildir. Şu durumda: gerekli tüm kaynak dosya kümesini hesaplamak için sorgu aracını kullanın gerekenden daha fazlasını raporlayabilir. çünkü örneğin, sorgu aracı tüm dosyalarınızı E-posta ve sohbet mesajı çevirisini desteklemek için bu özelliği derlemenizde kullanın.

Grafik düzeninin korunması hakkında

İşlemler tüm siparişleri korur alt ifadelerinden devralınan kısıtlamalarla ilgilidir. Örneğin, “kısmi sıranın korunumu yasası” olarak adlandırılır. Bir örnek: bağımlılıklarını öğrenmek için, elde edilen küme göre sıralayabilirsiniz. Örneğin, yalnızca file türündeki hedefleri içerir, aynı geçişli kısmi sıralama ilişkisinin oluşan alt kümede bir hedef çiftidir. bu çiftler orijinal grafikte doğrudan birbiriyle bağlantılıdır. (Derleme bağımlılık grafiğinde dosya-dosya kenarları yoktur).

Ancak tüm operatörler sıralamayı korur. Ancak bazı operatörler set işlemleri gibi işlemler Kendi sıralama kısıtlamaları sunmayın. Şu ifadeye dikkat edin:

deps(x) union y

Nihai sonuç kümesinin sırasının, tüm alt ifadelerinin kısıtlamalarını, yani tüm x öğesinin geçişli bağımlılıkları bir araya gelmelerini sağlar. Ancak sorgu, y içinde hedeflerin sıralaması veya deps(x) bölgesindeki hedeflerin sıralaması y ( y bu aynı zamanda deps(x)).

Sıralama kısıtlamaları sunan operatörler şunları içerir: allpaths, deps, rdeps, somepath ve hedef desen 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 ek sorgu işlevleri allrdeps ve rbuildfiles. Bu işlevler tüm (bu nedenle normal Sorgu için bir anlam ifade etmezler).

Evreni bir kapsam belirleme

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 şunları söyler: hedef kalıplar tarafından belirtilen hedef kalıbın geçişli kapanmasını önceden yükleyin. Bu işlem, eklemeli ve çıkarmalı olması gerekir. Daha sonra tüm sorgular bu "kapsama" göre değerlendirilir. Özellikle, allrdeps ve rbuildfiles operatörleri yalnızca bu kapsamdaki sonuçları döndürür. --infer_universe_scope, Bazel'a --universe_scope için bir değer tahmin etmesini söyler sorgu ifadesinden türetilir. Tahmin edilen bu değer, ancak isteğ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 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 için ters bağımlılıkların hiçbiri evrende mevcut değil. inşaat! 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, tests tanımı belirli bir .bzl dosyasını kullanan hedeflere geçişli olarak bağlıdır. Burada, --infer_universe_scope, özellikle de seçimin uygun olduğu durumlarda Aksi takdirde --universe_scope, sorgu ifadesini kendiniz ayrıştırmanızı gerektirir.

Örneğin, allrdeps ve rbuildfiles Yalnızca istediğiniz davranış belirlendiğinde --infer_universe_scope.

Sky Query'nin, varsayılan sorguyla karşılaştırıldığında bazı avantajları ve dezavantajları vardır. Ana dezavantajı ise çıktısını grafik sırasına göre sıralayamamasıdır. Dolayısıyla belli bir çıkış biçimleri yasaktır. Bunun avantajları, iki operatör (allrdeps ve rbuildfiles) varsayılan sorguda kullanılamaz. Ayrıca, Sky Query, Search Ads 360'taki Skyframe grafiği (yeni bir resim oluşturmak yerine) grafiğidir. Varsayılan uygulamanın işlevi budur. Dolayısıyla, bir iletişimin daha hızlıdır ve daha az bellek kullanı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. Bu sonuç, (sırasız) hedef kümesidir. En basit hedef kalıbı bir etikettir. tek bir hedef (dosya veya kural) tanımlar. Örneğin, hedef kalıp //foo:bar işlevinin sonucu, bir öğe, hedef ve bar kuralı.

Hedef kalıpları, etiketleri paketlere joker karakterler dahil edecek şekilde genelleştirir ve belirler. Örneğin, foo/...:all (veya yalnızca foo/...) bir hedef kalıbıdır her paketteki tüm kuralları yinelemeli bir şekilde içeren bir kümeye dönüşür foo dizininin altında; bar/baz:all, dönüşüm değerini içeren ancak bar/baz paketindeki tüm kuralları içeren bir kümeye alt paketler.

Benzer şekilde foo/...:*, şunu içeren bir kümenin sonucunu veren bir hedef kalıbıdır: tüm hedefleri (kurallar ve dosyalar), foo dizini; bar/baz:*, şundaki tüm hedefleri içeren bir küme olarak değerlendirilir: bar/baz paketine eklenir, ancak alt paketlerine dahil edilmez.

:* joker karakteri, kuralların yanı sıra dosyalarla da eşleştiğinden genellikle sorgular için :all değerine göre daha yararlıdır. Öte yandan, :all joker karakteri (dolaylı olarak hedef kalıpları (foo/... gibi) genellikle derlemeler için daha yararlıdır.

bazel query hedef kalıbı, bazel build derleme hedefinin işleyişiyle 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 bir kümeye (etiket söz konusu olduğunda) birçok öğe içeren küme (binlerce öğe içeren foo/... durumunda olduğu gibi) öğeleri) ya da boş kümeye (hedef kalıp hiçbir hedefle eşleşmiyorsa) uygulayabilirsiniz.

Hedef kalıbı ifadesinin sonucundaki tüm düğümler doğru şekilde sıralanır ve bağımlılık ilişkisine göre değişir. Dolayısıyla, foo:* yalnızca foo paketindeki hedef kümesi değildir, aynı zamanda grafik olarak ayarlayabilirsiniz. (Göreli sıralamayla ilgili herhangi bir garanti verilmez. diğer düğümlerle karşılaştırabilirsiniz.) 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şkenlerine karşılık gelir. Bir let ifadesinin değerlendirilmesinin sonucu aşağıdakiyle aynıdır: Toplam ücretsiz tekrarlarla birlikte, expr2 name değişkeni expr1.

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

Şu durumda dışında name değişken referansının tekrarlanması: kapsayan let name = ... ifadesi bir hatası. Diğer bir deyişle, üst düzey sorgu ifadelerinde değişkenlerine karşılık gelir.

Yukarıdaki dil bilgisi üretimlerinde name, kelime gibidir ancak C programlamasında yasal bir tanımlayıcı olduğuna dair ek kısıtlama dili'ne dokunun. Değişken referanslarının başına "$" eklenmelidir karakteriyle ayrılır.

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 simge veya kelime kullanarak söz dizimsel bir belirsizlik oluşturuyoruz. Ancak, anlamsal belirsizlik yoktur, çünkü adları, yasal hedef kalıpları olan kelimelerin alt kümesinden ayrıdır.

Teknik olarak, let ifadeleri artmıyor sorgu dilinin ifade gücü: bir dilde ifade edilebilen herhangi bir sorgu dil onlar olmadan da ifade edilebilir. Ancak, pek çok sorgunun özlü ve öz olmasını sağlar ve daha fazla etkili sorgu değerlendirmesini

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 bir nominal form ve bir sembolik bir biçim (ör. ^). Her iki form da eşdeğerdir; sembolik biçimler daha hızlı yazmanızı sağlar. (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şmelidir (simetrik); except (-) asimetrik. Ayrıştırıcı, üç operatörü de sol ilişkili ve eşit önceliğe sahip olduğundan 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, sıfır veya daha büyük bir kümenin birleşimini hesaplar Boşlukla (virgül olmadan) ayrılmış hedef kalıpları.

set(), Bourne kabuğunun $(...) özelliği ile birlikte çalışarak bir sorgunun sonuçlarını normal bir metin dosyasına kaydetmek, programlarını (standart UNIX kabuk araçları gibi) kullanarak bu metin dosyasını daha fazla bilgi edinmek için bir değer olarak sorgu aracına bahsedeceğim. Ö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 kabuk önceki awk komutu gibi cat dışındaki komutlar da kullanılabilir.

İşlevler

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

Sorgu dili birkaç işlevi tanımlar. İşlevin adı gereken bağımsız değişken sayısını ve türünü belirler. Aşağıdakiler şu işlevleri kullanabilirsiniz:

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

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

deps(x) operatörü, oluşturulan grafiği değerlendirir bağımsız değişken kümesine ait bağımlılıkların geçişli olarak kapatılmasıyla x. Örneğin, deps(//foo) değeri tüm alt düğümleri dahil olmak üzere foo tek düğümüne dayanan bağımlılık grafiği ve bildirmeyi konuştuk. deps(foo/...) değeri, kökleri olan bağımlılık grafikleridir foo dizininin altındaki her pakette bulunan tüm kurallardır. Bu bağlamda, "bağımlılıklar" yalnızca kural ve dosya hedefleri anlamına gelir. Bu nedenle, BUILD ve Bu hedefleri oluşturmak için gereken Starlark dosyaları buraya dahil değildir. 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 grafik sırası ile ilgili bölüme bakın.

deps operatörü tam sayı olan isteğe bağlı ikinci bağımsız değişkeni kabul eder. derinliğiyle ilgili bir üst sınırı belirten değişmez değer. ODK deps(foo:*, 0), foo paketindeki tüm hedefleri döndürür, deps(foo:*, 1), aynı zamanda foo paketi ve deps(foo:*, 2) ayrıca düğümleri doğrudan içerir deps(foo:*, 1) vb. düğümlerden erişilebilir. (Bu sayılar minrank çıkış biçiminde gösterilen sıralamalara karşılık gelir.) depth parametresi atlanırsa arama sınırsız: ön koşulların refleksif geçişli kapanışı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, bağımsız değişken grubunun ters bağımlılıklarını değerlendirir Evrenin geçişli kapanışında x u.

Ortaya çıkan grafik, bağımlılık ilişkisine göre sıralanır. Bkz. grafik sırası hakkındaki bölüme bakın.

rdeps operatörü tam sayı olan isteğe bağlı üçüncü bağımsız değişkeni kabul eder derinliğiyle ilgili bir üst sınırı belirten değişmez değer. Bunun sonucunda grafik yalnızca herhangi bir uzaklığa göre belirtilen derinliğe sahip bir uzaklıkta bulunan düğümleri içerir düğümünü devre dışı bırakın. Dolayısıyla rdeps(//foo, //common, 1), tüm düğümleri değerlendirir doğrudan //common kaynaklı olan //foo ürününün geçişli olarak kapatılması kapsamında. (Bu sayılar, minrank çıkışında gösterilen sıralamalara karşılık gelir format.) depth parametresi atlanırsa sınırsızdır.

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

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

allrdeps operatörü, rdeps ile aynı şekilde davranır. işlecini kullanın, ancak "evren kümesi" --universe_scope işareti neyse olarak değerlendirilmesini sağlar. Dolayısıyla, --universe_scope=//foo/... geçildi, ardından 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ü, hedef kümesinin tamamını değerlendirir bağımsız değişken grubundaki bir hedefle aynı pakette bulunan ve ona doğrudan bağlı olan öğeleri içerir.

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

expr ::= siblings(expr)

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

Rastgele seçim: bazı

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

some(x, k) operatörü kendisinden rastgele olarak en fazla k hedef seçer bağımsız değişken grubu x ve şu ifadeyi içeren bir küme olarak değerlendirilir: yalnızca bu hedefleri hedefler. k parametresi isteğe bağlıdır; eğer eksikse sonuç, yalnızca tek bir hedef içeren tek bir küme olur rastgele seçilir. x bağımsız değişken grubunun boyutu şuysa: k değerinden küçükse, bağımsız değişken grubunun tamamı x iade edilecek.

Örneğin, some(//foo:main union //bar:baz) ifadesi //foo:main veya //bar:baz içeren tekil küme henüz tanımlanmadı. some(//foo:main union //bar:baz, 2) veya some(//foo:main union //bar:baz, 3), hem //foo:main hem de onu döndürür //bar:baz.

Bağımsız değişken tekli sayıysa some kimlik işlevini hesaplar: some(//foo:main) //foo:main ile eşdeğerdir.

Belirtilen bağımsız değişken grubu boşsa some(//foo:main intersect //bar:baz) ifadesi.

Yol operatörleri: somepath, allpaths

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

somepath(S, E) ve allpaths(S, E) operatörleri hesaplama iki hedef kümesi arasındaki yolları gösterir. Her iki sorgu da bağımsız değişkenler, başlangıç noktası S ve bir grup Bitiş noktasının E kadarı. somepath şunu döndürür: bir hedeften rastgele bazı yollardaki düğümlerin grafiği E bölgesinde bir hedefe S; allpaths şu hedeften tüm yollardaki düğümlerin grafiğini döndürür: E konumundaki herhangi bir hedefe S.

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 dizi hedefe filtre uygular ve bu hedefleri siler resimlerden birkaçını görebilirsiniz. pattern parametresi, ne tür bir hedefin eşleştirileceğini belirtir.

Örneğin, BUILD dosyası tarafından tanımlanan dört hedefin türleri (p paketi için) aşağıda 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

Dolayısıyla kind("cc_.* rule", foo/...), toplam cc_library, cc_binary vb. arasından foo ve kind("source file", deps(//foo)) altındaki kural hedefleri geçişli kapatmadaki tüm kaynak dosyalar kümesini değerlendirir //foo hedefinin bağımlılıklarını ifade eder.

pattern bağımsız değişkeni için genellikle tırnak işareti eklenmesi gerekir çünkü bu olmadan source file ve .*_test gibi birçok normal ifade ayrıştırıcı tarafından kelime olarak değerlendirilmez.

package group için eşleşirken ile biten hedefler :all sonuç vermeyebilir. Bunun yerine :all-targets politikasını kullanın.

Hedef adı filtreleme: filtre

expr ::= filter(word, expr)

filter(pattern, input) operatörü, bir filtre uygulamak üzere bir dizi hedefe uygulanır ve etiketler (mutlak biçimde) kalıpla eşleşmez; o bir alt kümesi olarak değerlendirilir.

Birinci bağımsız değişken olan pattern, Hedef adlarına göre normal ifade kullanılır. filter ifadesi şuna benzer tüm hedefleri içeren bir kümeye dönüşür: x x, input grubunun ve etiket (//foo:bar gibi mutlak biçimde) / x, (bağlanmamış) bir eşleşme içeriyor şu normal ifade için geçerlidir: pattern. Her şeyden beri hedef adları // ile başladığından, alternatif olarak kullanılabilir ifadesini ^ normal ifade anchor.

Bu operatör genellikle intersect operatörü. Örneğin, menüdeki tüm //foo:foo hedefinde bar bağımlılık varsa, değerlendir

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

Ancak bu ifade,BUILD bar ağacı, bu yavaştır ve hatalara açıktır alakasız BUILD dosyaları. Bir alternatif şöyle olabilir:

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

Bu ilk olarak //foo bağımlılıkları kümesini hesaplar ve yalnızca sağlanan kalıpla eşleşen hedefleri filtreler. kelimeleri, alt dize olarak //bar içeren adlara sahip hedefleri ifade eder.

filter(pattern, expr) operatörünün diğer bir yaygın kullanımı, belirli dosyaları özelliklerine göre filtrelemektir. girin. Ö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)

İlgili içeriği oluşturmak için kullanılan attr(name, pattern, input). operatör bir hedef grubuna filtre uygular ve hedef kümesi olmayan hedefleri siler kurallar, name özelliğine sahip olmayan kural hedefleri özellik değerinin sağlanan ile eşleşmediği tanımlanmış veya kural hedefleri normal ifade pattern; şu şekilde değerlendirir: alt kümesine ekler.

İlk bağımsız değişken olan name, kuralın adıdır normal ifade kalıbı. İkinci bağımsız değişken pattern, özellik üzerindeki normal ifadedir değerler. attr ifadesi, tüm hedefleri içeren küme olarak değerlendirilir x değeri, x input grubunun üyesi, name özelliği ve özellik değeri, normal ifade için (bağlanmamış) eşleşmesi pattern. name bir isteğe bağlı özellik ve kural bunu açıkça belirtmiyor ve ardından varsayılan özellik değeri karşılaştırma için kullanılır. Örneğin,

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

bir//foo linkshared özelliğini (cc_binary kuralı gibi) kullanıyorsanız ve açıkça 0'a ayarlanır veya hiç ayarlamayın, ancak varsayılan değer 0'dır (örneğin, cc_binary kural) kaldırın.

Liste türü özellikler (ör. srcs, data vb.) [value<sub>1</sub>, ..., value<sub>n</sub>] biçiminde dizelere dönüştürülür, [ ayracı ile başlayan, ] parantezle biten ve "," kullanarak (virgül, boşluk) kullanabilirsiniz. Etiketler, etiket. Örneğin, deps=[":foo", "//otherpkg:bar", "wiz"] özelliği [//thispkg:foo, //otherpkg:bar, //thispkg:wiz] dizesi. Köşeli parantezler her zaman mevcuttur, bu nedenle boş listede [] dize değeri kullanılır kullanabilirsiniz. Örneğin,

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

içeren //foo bağımlılık arasından boş srcs özelliği,

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

, //foo bağımlılığı arasından data özelliğinde en az bir değer olmalıdır (her etiket en az // ve : nedeniyle 3 karakter uzunluğunda).

Bir testte belirli bir value öğesine sahip //foo bağımlılıkları arasındaki tüm kuralları seçmek için list-type özelliği için,

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

Bu işe yarar, çünkü value karakterinden önceki karakter [ veya bir boşluk ve value sonrasındaki karakter virgül veya ] olacaktı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 filtre uygulanmayan hedefleri siler görünürlük.

Birinci bağımsız değişken olan predicate, tüm kullanıcıların hedeflediği görünür olması gerekir. visible ifadesi şuna sahip tüm hedefleri içeren bir küme olarak değerlendirilir: x x input grubunun bir üyesidir ve bu grubun tüm hedefleri için y predicate x, y tarafından görülebilir. Örneğin:

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

//bar paketindeki şu //foo hedeflerini seçecek kullanabileceğiniz reklam biçimleri, görünürlük kısıtlamalarını ihlal etmeden

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

expr ::= labels(word, expr)

labels(attr_name, inputs) işleci, "label" türündeki attr_name özelliği veya "etiketin listesi" inç inputs kümesindeki bazı kurallar.

Örneğin, labels(srcs, //foo), srcs özelliğinde görünen hedefler //foo kuralı. Birden fazla kural varsa inputs grubunda srcs özellikleri varsa srcs sendromu döndürüldü.

test_suites: testleri genişletip filtrele

expr ::= tests(expr)

tests(x) operatörü, tüm testlerin kümesini döndürür x kümesindeki tüm test_suite kuralları şu şekilde genişletilir: bağımsız test grubudur ve teste katılanlara tag ve size.

Varsayılan olarak, sorgu değerlendirme test_suite kuraldaki test dışı hedefleri yoksayar. Bu özellik, --strict_test_suite seçeneğine sahip hatalar olarak değiştirildi.

Örneğin, kind(test, foo:*) sorgusu tüm *_test ve test_suite kuralları (foo paketinde) Tüm sonuçlar ( (tanım) foo paketinin üyeleri için geçerlidir. Öte yandan tests(foo:*) sorgusu, bazel test foo:* tarafından yürütülecek bağımsız testler: diğer paketlere ait testleri, Doğrudan veya dolaylı olarak referans verilen test_suite kural üzerinden.

Paket tanımı dosyaları: buildfiles

expr ::= buildfiles(expr)

buildfiles(x) operatörü grubu döndürür her hedefin paketlerini tanımlayan ve ayar x; diğer bir deyişle her paket için BUILD dosyası, ve load üzerinden başvurduğu tüm .bzl dosyalarını içerebilir. Bu ayrıca, bunları içeren paketlerin BUILD dosyalarını da döndürür load dosya içeren dosyalar.

Bu operatör genellikle hangi dosyaların veya belirli bir hedef oluşturmak için gereklidir. Bunlar, çoğu zaman aşağıdaki --output package seçeneğini kullanabilirsiniz). Ö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 dosyaları kümesi. Örneğin, //foo bir paketse rbuildfiles(foo/BUILD), //foo:BUILD hedef. foo/BUILD dosyasında load('//bar:file.bzl'... varsa rbuildfiles(bar/file.bzl) //foo:BUILD hedefini ve şunu içeren diğer BUILD dosyalarının hedeflerini döndürür: //bar:file.bzl sürümünü yükle

rbuildfiles operatörünün kapsamı, --universe_scope işareti. BUILD dosyalarına ve .bzl dosyalarına doğrudan karşılık gelmeyen dosyalar dosyaları, sonuçları etkilemez. Örneğin, kaynak dosyalar (ör. foo.cc) yoksayılır, bunlar BUILD dosyasında açıkça belirtilse bile geçerlidir. Bununla birlikte sembol bağlantılara saygı duyulur, foo/BUILD, bar/BUILD ile sembolik bağlantıysa rbuildfiles(bar/BUILD), sonuçlarına //foo:BUILD ekleyecek.

rbuildfiles operatörü, ahlaki açıdan buildfiles operatörü. Ancak bu, ahlaki açıdan bir yönde daha güçlüdür: rbuildfiles çıktıları da öncekiyle aynı buildfiles girişleri; ilki, paketlerde yalnızca BUILD dosya hedefi içerir, ikincisi de bu tür hedefleri içerebilir. Diğer yönden ise yazışmalar daha zayıftır. İlgili içeriği oluşturmak için kullanılan buildfiles operatörünün çıkışları, tüm paketlere karşılık gelen hedeflerdir ve .bzl. dosyaları ifade eder. Ancak rbuildfiles operatörünün girişleri şunlardır: 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ü, Her hedefin paketini oluşturmak için gereken Starlark dosyaları x ayarla. Diğer bir deyişle, her paket için BUILD dosyalarından başvurulan .bzl dosyaları.

Çıkış biçimleri

bazel query bir grafik oluşturur. İçeriği, biçimi ve sıralamayı bazel query bu grafiği sunar --output komut satırı seçeneği ile yapabilirsiniz.

Sky Query ile çalışırken yalnızca sırasız çıkışlara izin verilir. Özellikle, graph, minrank ve maxrank çıkış biçimi yasak.

Çıkış biçimlerinden bazıları ek seçenekleri kabul eder. Kişinin adı her çıkış seçeneğinin önüne, o çıktı biçiminin geçerlidir, dolayısıyla --graph:factored yalnızca geçerlidir --output=graph kullanılırken; herhangi bir etkisi yoktur. graph dışında bir çıkış biçimi kullanılıyor. Aynı şekilde, --xml:line_numbers yalnızca --output=xml olduğunda geçerlidir için kullanılıyor.

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

Sorgu ifadeleri her zaman "yasanın grafik sırasının korunumu" ifadesi kullanılarak sonuçlar sunularak bağımlılığı olan ya da olmayan bir şekilde yönetmektir. Bunu yapmaz sonuç kümesindeki hedefleri veya sorgunun nasıl hesaplandığını etkiler. Yalnızca sonuçların stdout'a nasıl yazdırılacağını etkiler. Ayrıca eşdeğeri, alfabetik olarak sıralanabilir veya sıralanmayabilir. Bu davranışı kontrol etmek için --order_output işareti kullanılabilir. (--[no]order_results işareti, işlevin bir alt kümesini içerir --order_output işaretinin yerini almıştır ve kullanımdan kaldırılmıştır.)

Bu işaretin varsayılan değeri auto şeklindedir ve sonuç olarak sözlüksel sipariş. Ancak somepath(a,b) kullanıldığında sonuçlar şurada yazdırılır: Bunun yerine deps siparişi verildi.

Bu bayrak no ve --output şunlardan biri olduğunda: build, label, label_kind, location, package, proto veya xml ise çıkışlar isteğe bağlı olarak yazdırılır. Bu genellikle en hızlı seçenektir. Ancak bu özellik --output şunlardan biridir: graph, minrank veya maxrank: Bazel, bu biçimlerle her zaman sonuçları yazdırır sıralandığına dikkat edin.

Bu işaret deps olduğunda Bazel baskıları topolojik bir sırayla gerçekleşir, yani bağımlılıkları belirleyebilirsiniz. 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 düğüm ziyaret edilmemiş düğümlere giden kenarların aktarıldığı sipariş sonrası derinlik öncelikli arama alfabetik sırasıdır. Son olarak, düğümler sıranın tersi yönde yazdırılır. verileri görüntüler.

Düğümleri bu sırada yazdırmak daha yavaş olabilir. Bu nedenle, yalnızca deterministik ilkeler söz konusu olduğunda kullanılmalıdır önemlidir.

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

--output build

Bu seçenekte her bir hedef sanki gerçekten BUILD dilinde el yazısıyla yazılmıştır. Tüm değişkenler ve işlev çağrıları (glob, makrolar gibi) genişletilir, bu da etkiyi görmek açısından yararlıdır. oluşturabilirsiniz. Ayrıca, her geçerli kural, generator_name ve/veya generator_function) değeri için, etkili kuralı oluşturmak için değerlendirilen makronun adını verin.

Çıkış, BUILD dosyalarıyla aynı söz dizimini kullansa da bu yöntem geçerli bir BUILD dosyası oluşturması garanti edilir.

--output label

Bu seçenekle, her bir hedefin ad kümesi (veya etiketleri) ortaya çıkan grafik, her satırda bir etiket olacak şekilde topolojik sıra (--noorder_results belirtilmediği sürece bkz. sonuçların sıralamasıyla ilgili notlar). (Topolojik sıralama, bir grafiğin Düğümü, haleflerinin hepsinden önce görünür.) Tabii ki var bir grafiğin birçok olası topolojik sıralamasıdır (ters postorder bunlardan yalnızca biridir); hangisinin seçilmediği belirtilmemiştir.

Bir somepath sorgusunun çıkışını yazdırırken, yolların sırasıdır.

Uyarı: Bazı kritik durumlarda, iki farklı hedef olabilir. aynı etiket; örneğin bir sh_binary kuralı ve tek (dolaylı) srcs dosyasının her ikisi de çağrılabilir foo.sh. Bir sorgunun sonucu şunların her ikisini de içeriyorsa: çıkış (label biçiminde) görünür kullanabilirsiniz. label_kind (bkz. biçimiyle devam ederse, aradaki fark açıklığa kavuşturulur: iki hedefin aynı ad ancak birinde sh_binary rule türü ve diğer tür source file.

--output label_kind

label gibi, bu çıkış biçimi de şunun etiketlerini yazdırır: oluşturulan grafikteki her bir hedef, topolojik sırada olmakla birlikte, ek olarak, etiketten hedefin türünü ekler.

--output proto

Sorgu çıkışını QueryResult protokol arabelleğine alınır.

--output streamed_proto

Şunu yazdırır: uzunlukla sınırlandırılmış akışı Target protokol arabellekleridir. Bu, (i) sitenizin farklı bölümlerinde boyut sınırlamaları tek bir protokole sığmayacak kadar çok hedef olduğunda, QueryResult veya (ii)'i tıklayın.

--output textproto

--output proto özelliğine benzer şekilde, QueryResult protokol arabelleğinde, ancak metin biçimini kullanın.

--output streamed_jsonproto

--output streamed_proto özelliğine benzer şekilde, şu akışı yazdırır: Target protokol arabellekleridir ancak ndjson biçimindedir.

--output minrank --output maxrank

label gibi, minrank ve maxrank çıkış biçiminde her bir gösterilen grafikte hedefi belirliyoruz. Ancak, topolojik sırada, her biri kendisinden önce sıralama numarası. Bunlar, sonuç sıralamasından etkilenmez --[no]order_results işareti (notlara bakın sıralamayı gösterir).

Bu biçimin iki varyantı var: minrank sıralamaları kök düğümden ona giden en kısa yolun uzunluğu kadardır. "Kök" düğümlerin (gelen kenarları olmayanlar) sıralaması 0'dır. bunlar daha üst sıralardadır vb. (Her zaman olduğu gibi, kenarlar bağlı olduğu hedeflerin hedeflenmesi gerekir.)

maxrank her düğümü en uzun olanın uzunluğuna göre sıralar yolu vardır. Aynı şekilde, sıralama 0 ise diğer tüm tüm düğümlerin maksimum sıralamasından daha yüksek bir sıralamaya .

Bir döngüdeki tüm düğümlerin eşit sırada olduğu kabul edilir. (Grafiklerin çoğu döngüsel, ancak döngüler de vardır çünkü BUILD dosyalarının hatalı döngüler içermesi.)

Bu çıkış biçimleri, bir grafiğin ne kadar derin olduğunu keşfetmek için yararlıdır. deps(x), rdeps(x) sonucu için kullanılırsa veya allpaths sorgusuna karşılık gelir, sıralama numarası şuna eşittir: en kısa (minrank ile) veya en uzun x konumundan bir düğüme giden (maxrank ile) yol daha iyi olur. maxrank, veri feed'inizi bir hedef oluşturmak için gereken en uzun derleme adımı dizisidir.

Örneğin, soldaki grafik sağdaki çıktıları verir --output minrank ve --output maxrank olduğunda URL'leri belirtir.

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 her hedefin türünü ve etiketini görecektir. Ancak bu, ön ekini, söz konusu hedefin konumunu açıklayan bir dizeyle satır numarasını girin. Bu biçim, grep Bu nedenle, ikincisini ayrıştırabilen araçlar (Emacs gibi veya vi), bir dizi sorguya göz atmak için sorgu çıkışını da kullanabilir. eşleşmesini sağlayarak Bazel sorgu aracının bir bağımlılık grafiğine duyarlı "BUILD dosyaları için grep" komutu gönderin.

Konum bilgileri, hedef türüne göre değişiklik gösterir (tür operatörüne bakın). Kurallarda BUILD dosyasındaki kural bildiriminin konumu yazdırılır. Kaynak dosyalarda, gerçek dosyanın 1. satırının konumu şu şekildedir: yazdırılır. Oluşturulan bir dosya için, yazdırılmasını sağlar. (Sorgu aracında, sorgu aracındaki oluşturulan dosyanın gerçek konumunu bulmak için gereken bilgileri ve her koşulda, bir derleme henüz yapılmamış olabilir.)

--output package

Bu seçenek, hedeflenecek tüm paketlerin adlarını bazı hedeflerin ait olduğu anlamına gelir. Adlar basılı dilde sözlük sıralaması; yinelenen kayıtlar hariç tutulur. Bu, resmî anlamda etiket kümesinden (paket, hedef) oluşan bir projeksiyondur paketlerini ekleyebilirsiniz.

Harici depolardaki paketler şu şekilde biçimlendirilir: Ana depodaki paketler şu durumdayken @repo//foo/bar foo/bar biçimindedir.

Bu çıkış, deps(...) sorgusu ile bağlantılı olarak seçeneği, işaretlenmesi gereken paket grubunu bulmak için kullanılabilir. belirli bir hedef kümesi oluşturmaktır.

Sonucun grafiğini göster

--output graph

Bu seçenek, sorgu sonucunun yönlendirilmiş popüler AT&T GraphViz biçimindeki grafik. 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 bir çağrı için aşağıdaki örnek bölüme bakın.

Bu çıkış biçimi özellikle allpaths, deps veya rdeps sorguları, burada sonuç aşağıdaki işlemler sırasında kolayca görselleştirilemeyen yollar grubu içerir --output label gibi doğrusal bir biçimde oluşturulur.

Varsayılan olarak, grafik faktörlü bir biçimde oluşturulur. Yani, topolojik olarak denk düğümler tek bir düğümde birleştirilir. düğümün birden çok etiketi vardır. Bu şekilde, grafiği daha kompakt hale getirir ve okunabilir, çünkü tipik sonuç grafiklerinde tekrarlayan dönüştürmeler var. Örneğin, bir java_library kuralı tarafından oluşturulan yüzlerce Java kaynak dosyasına bağlı olabilir. aynı genrule; çarpan grafiğinde, tüm bu dosyaların tek bir düğümle temsil edilir. Bu davranış devre dışı bırakılabilir --nograph:factored seçeneği ile birlikte.

--graph:node_limit n

Bu seçenek, grafik düğümünü de kullanabilirsiniz. Uzun etiketler kısaltılır; -1 kesmeyi devre dışı bırakır. Grafiklerin çarpanlarına ayrılmış biçimden Düğüm etiketleri çok uzun olabilir. GraphViz Varsayılan değer olan 1024 karakteri aşan etiketleri işle tercih edebilirsiniz. Bu seçeneğin hiçbir etkisi yoktur. --output=graph kullanılıyor.

--[no]graph:factored

Varsayılan olarak, grafikler açıklandığı gibi çarpanlarına ayrılmış biçimde görüntülenir. yukarıda. --nograph:factored belirtildiğinde, grafikler dikkate almadan yazdırılabilir. Bu, GraphViz kullanarak görselleştirme sağlar pratik değildir ancak daha basit olan biçim, diğer reklamverenler tarafından işlenmesini kolaylaştırabilir araçlar (grep gibi). Bu seçeneğin etkisi yok --output=graph kullanılmıyorsa.

XML

--output xml

Bu seçenek, sonuçta ortaya çıkan hedeflerin XML biçiminde yazdırılmasına neden olur formunu doldurun. Çıkış şuna benzer bir XML üstbilgisiyle başlar:

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

ve ardından her hedef için bir XML öğesiyle devam eder topolojik sıraya göre (ör. sırasız sonuçlar istendiğinde), ve ardından bir sonlandırmayla 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ılmıştır ve tüm değeri olmayanlar dahil olmak üzere kuralın kuralın BUILD dosyasında açıkça belirtilir.

Ayrıca, sonuçta rule-input ve rule-output öğesi, böylece feed topolojisinin bağımlılık grafiğini bilmek zorunda kalmadan örneğin, srcs özelliğinin öğeleri bağımlılıklarını (ön koşullar) ve outs özelliği, geriye dönük bağımlılıklardır (tüketiciler).

Dolaylı bağımlılıklar için rule-input öğeleri --noimplicit_deps belirtilmiş.

  <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 bir name içerir özelliğinin değeri hedefin etiketi ve değeri hedefinlocation --output location tarafından yazdırıldığı şekliyle konumu.

--[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ışı, bu tür bir özelliğin varsayılan değeridir (örneğin, BUILD dosyasında belirtilmemişti veya varsayılan değer (açıkça sağlanır). Bu seçenek, bu tür özellik değerlerinin XML çıkışına eklenir.

Normal ifadeler

Sorgu dilindeki normal ifadeler Java normal ifade kitaplığını kullandığından tam söz dizimi java.util.regex.Pattern.

Harici depolarla sorgulama

Derleme, harici depolardaki kurallara dayanıyorsa ( WORKSPACE dosyası) yazarsanız sorgu sonuçları bu bağımlılıkları içerir. Örneğin, örneğin //foo:bar, //external:some-lib metriğine bağlıysa ve //external:some-lib @other-repo//baz:lib adresine bağlı, ardından bazel query 'deps(//foo:bar)' şunları listeler: @other-repo//baz:lib ve //external:some-lib olarak belirleyin.

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. Google ise //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