Bu sayfa, derleme bağımlılıklarını analiz etmek için bazel query
kullandığınızda kullanılan Bazel Sorgu Dili için referans kılavuzudur. bazel query
tarafından desteklenen çıkış biçimleri de açıklanmaktadır.
Pratik kullanım örnekleri için Bazel Sorgu Nasıl Yapılır? bölümüne bakın.
Ek sorgu referansı
Bazel, yükleme sonrası aşama hedef grafiğinde çalışan query
'a ek olarak eylem grafiği sorgusu ve yapılandırılabilir sorgu içerir.
Eylem grafiği sorgusu
İşlem grafiği sorgusu (aquery
) analiz sonrası Yapılandırılmış Hedef Grafiği üzerinde çalışır ve İşlemler, Yapılar ve bunların ilişkileri hakkında bilgi sunar. aquery
, Yapılandırılmış Hedef Grafiği'nden oluşturulan İşlemlerin/Yapıların özellikleriyle ilgileniyorsanız yararlıdır.
Örneğin, gerçek komutlar çalışır ve bunların girişleri, çıkışları ve anımsatıcılar.
Daha fazla ayrıntı için sorgu referansına bakın.
Yapılandırılabilir sorgu
Geleneksel Bazel sorgusu, yükleme sonrası aşama hedef grafiği üzerinde çalıştırılır ve dolayısıyla yapılandırmalar ve bunlarla ilişkili kavramlar hakkında bilgi içermez. Özellikle seçili ifadeleri doğru şekilde çözümlemez ve bunun yerine seçimlerin tüm olası çözümlerini döndürür. Ancak yapılandırılabilir sorgu ortamı cquery
, yapılandırmaları düzgün bir şekilde işler ancak bu orijinal sorgunun tüm işlevlerini sunmaz.
Daha fazla bilgi için cquery referansına bakın.
Örnekler
Kullanıcılar bazel query
ürününü nasıl kullanıyor? Tipik örnekler:
//foo
ağacı neden //bar/baz
alanına bağımlı?
Bir yol göster:
somepath(foo/..., //bar/baz:all)
Tüm foo
testlerinin hangi C++ kitaplıkları foo_bin
hedefinin yapmamasına bağlı olur?
kind("cc_library", deps(kind(".*test rule", foo/...)) except deps(//foo:foo_bin))
Jetonlar: Söz dizimi söz dizimi
Sorgu dilindeki ifadeler aşağıdaki jetonlardan oluşur:
Anahtar kelimeler (ör.
let
). Anahtar kelimeler, dil için ayrılmış kelimelerdir. Her biri aşağıda açıklanmıştır. Tüm anahtar kelime takımı şudur:"
foo/...
", ".*test rule
" veya "//bar/baz:all
" gibi kelimeler. Bir karakter dizisi "tırnak içinde" (tek tırnak ile başlayıp biter veya çift tırnak ile başlayıp biterse) kelimedir. Bir karakter dizisi tırnak içine alınmamışsa yine de kelime olarak ayrıştırılabilir. Tırnak içinde olmayan kelimeler; A'dan Za-z alfabe karakterlerinden, 0-9 arasındaki sayılardan ve*/@.-_:$~[]
özel karakterlerden (yıldız, öne eğik çizgi, @ nokta, kısa çizgi, alt çizgi, iki nokta, dolar işareti, yaklaşık işareti, sol köşeli ayraç, sağ köşeli parantez) oluşturulan karakter dizileridir. Bununla birlikte, göreli hedef adlar bu karakterlerle başlasa da, tırnak içine alınmamış kelimeler kısa çizgi-
veya yıldız*
ile başlayamaz.Tırnak içinde olmayan kelimeler, hedef adlarda bu karakterlere izin verilse bile, artı işareti
+
veya eşittir işareti=
içeremez. Sorgu ifadeleri oluşturan kod yazılırken hedef adlar tırnak içine alınmalıdır.Kullanıcı tarafından sağlanan değerlerden Bazel sorgu ifadeleri oluşturan komut dosyaları yazarken alıntı yapılması gerekir.
//foo:bar+wiz # WRONG: scanned as //foo:bar + wiz. //foo:bar=wiz # WRONG: scanned as //foo:bar = wiz. "//foo:bar+wiz" # OK. "//foo:bar=wiz" # OK.
Bu alıntının, kabuğunuzun gerektirdiği herhangi bir alıntıya ek olarak yazıldığını unutmayın. Örneğin:
bazel query ' "//foo:bar=wiz" ' # single-quotes for shell, double-quotes for Bazel.
Anahtar kelimeler ve operatörler, alıntılandığında normal kelimeler olarak kabul edilir. Örneğin,
some
bir anahtar kelimeyken "bazıları" bir kelimedir. Hemfoo
hem de "foo" kelimedir.Ancak hedef adlarında tek veya çift tırnak kullanırken dikkatli olun. Bir veya daha fazla hedef adından alıntı yaparken yalnızca tek bir tırnak türü (tümü tek veya tümü çift tırnak) kullanın.
Aşağıda, Java sorgu dizesinin ne olacağına ilişkin örnekler verilmiştir:
'a"'a' # WRONG: Error message: unclosed quotation. "a'"a" # WRONG: Error message: unclosed quotation. '"a" + 'a'' # WRONG: Error message: unexpected token 'a' after query expression '"a" + ' "'a' + "a"" # WRONG: Error message: unexpected token 'a' after query expression ''a' + ' "a'a" # OK. 'a"a' # OK. '"a" + "a"' # OK "'a' + 'a'" # OK
Bu söz dizimini, çoğu durumda tırnak işaretlerine gerek kalmaması için seçtik. (Olağan dışı)
".*test rule"
örneği tırnak işareti gerektirir: Nokta ile başlar ve boşluk içerir."cc_library"
alıntısı yapmak gereksiz olsa da zararsızdır.Noktalama; ör.
()
, nokta.
ve virgül,
. Noktalama içeren kelimeler (yukarıda listelenen istisnalar dışında) tırnak içine alınmalıdır.
Alıntılanan kelimenin dışındaki boşluk karakterleri yok sayılır.
Bazel sorgu dili kavramları
Bazel sorgu dili ifadelerin dilidir. Her ifade, kısmen sıralanmış bir hedef grubu veya eşdeğer olarak bir hedef grafiği (DAG) olarak değerlendirilir. Tek veri türü budur.
Küme ve grafik aynı veri türüne karşılık gelir, ancak verinin farklı yönlerini vurgulayın. Örneğin:
- Ayarla: Hedeflerin kısmi sırası ilginç değildir.
- Grafik: Hedeflerin kısmi sırası önemlidir.
Bağımlılık grafiğindeki döngüler
Derleme bağımlılık grafiklerinin döngüsel olması gerekir.
Sorgu dili tarafından kullanılan algoritmalar, döngüsel grafiklerde kullanılmak üzere tasarlanmıştır ancak döngülere karşı dayanıklıdır. Döngülerin nasıl işlendiğiyle ilgili ayrıntılar belirtilmemiştir ve bu ayrıntılara güvenilmemelidir.
Örtülü bağımlılıklar
Bazel, BUILD
dosyalarında açıkça tanımlanan bağımlılıklar oluşturmanın yanı sıra kurallara ek dolaylı bağımlılıklar ekler. Örneğin, her Java kuralı dolaylı olarak JavaBuilder'a bağlıdır. Dolaylı bağımlılıklar, $
ile başlayan özellikler kullanılarak oluşturulur ve BUILD
dosyalarında geçersiz kılınamaz.
bazel query
, sorgu sonucunu hesaplarken varsayılan olarak örtülü bağımlılıkları dikkate alır. Bu davranış, --[no]implicit_deps
seçeneğiyle değiştirilebilir. Sorgu, yapılandırmaları dikkate almadığından potansiyel araç zincirlerinin asla dikkate alınmadığını unutmayın.
Ses düzeyi
Bazel sorgu dili ifadeleri, derleme bağımlılık grafiği üzerinde çalışır. Bu grafik, tüm BUILD
dosyalarındaki tüm kural bildirimleri tarafından dolaylı olarak tanımlanır. Bu grafiğin biraz soyut olduğunu ve bir derlemenin tüm adımlarının nasıl gerçekleştirileceğine dair kapsamlı bir açıklama sunmadığını anlamak önemlidir. Bir derleme gerçekleştirmek için yapılandırma da gerekir. Daha ayrıntılı bilgi için Kullanıcı Kılavuzu'nun yapılandırmalar bölümüne bakın.
Bazel sorgu dilindeki bir ifadenin değerlendirilmesinin sonucu tüm yapılandırmalar için doğrudur. Bu, tam olarak kesin olmayan ve konservatif bir aşırı yaklaşık tahmin olabileceği anlamına gelir. Sorgu aracını bir derleme sırasında gereken tüm kaynak dosya kümesini hesaplamak için kullanırsanız, sorgu aracı, örneğin derlemenizde kullanmayı amaçlamıyor olsanız bile mesaj çevirisini desteklemek için gereken tüm dosyaları içerdiğinden, gerçekte gerekenden daha fazlasını raporlayabilir.
Grafik düzeninin korunması hakkında
İşlemler, alt ifadelerinden devralınan tüm sıralama kısıtlamalarını korur. Bunu "kısmi sıranın korunduğu yasa" gibi düşünebilirsiniz. Şu örneği düşünün: Belirli bir hedefin bağımlılıklarının geçişli olarak kapanmasını belirlemek için bir sorgu yayınlarsanız, elde edilen küme bağımlılık grafiğine göre sıralanır. Yalnızca file
türündeki hedefleri içerecek şekilde filtre uygularsanız ortaya çıkan alt kümedeki her hedef çifti arasında aynı geçişli kısmi sıralama ilişkisi geçerli olur (bu çiftlerden hiçbiri orijinal grafikte doğrudan bağlı olmasa da).
(Derleme bağımlılık grafiğinde dosya dosyası kenarı yoktur).
Bununla birlikte, tüm operatörler sırayı korusa da set işlemleri gibi bazı işlemler kendi sıralama kısıtlamalarını uygulamaz. Şu ifadeyi ele alalım:
deps(x) union y
Nihai sonuç kümesinin sırası, alt ifadelerinin tüm sıralama kısıtlamalarının korunacağı, diğer bir deyişle x
öğesinin tüm geçişli bağımlılıklarının birbirine göre doğru şekilde sıralanacağı garanti edilir. Ancak sorgu, y
içindeki hedeflerin sıralamasıyla ilgili veya y
içindeki hedeflere kıyasla deps(x)
konumundaki hedeflerin sıralamasıyla ilgili hiçbir şey garanti etmez (y
bölgesinde de deps(x)
içinde olan hedefler hariç).
Sıralama kısıtlamalarının eklendiği operatörler arasında allpaths
, deps
, rdeps
, somepath
ve hedef kalıp joker karakterleri package:*
, dir/...
vb. bulunur.
Gökyüzü sorgusu
Gökyüzü Sorgusu, belirli bir evren kapsamı üzerinde çalışan bir sorgu modudur.
Yalnızca SkyQuery'de kullanılabilen özel işlevler
Sky Query modunda ek sorgu işlevleri allrdeps
ve
rbuildfiles
bulunur. Bu işlevler, tüm evrenin kapsamında çalışır (bu nedenle normal Sorgu için anlamlı değildir).
Evren kapsamı belirleme
Sky Query modu, şu iki bayrağın iletilmesiyle etkinleştirilir:
(--universe_scope
veya --infer_universe_scope
) ve
--order_output=no
.
--universe_scope=<target_pattern1>,...,<target_patternN>
, sorguya hedef kalıpların belirttiği hedef kalıbın geçişli kapanışını önceden yüklemesini söyler. Bu işlem hem toplama hem de çıkarma olabilir. Daha sonra tüm sorgular bu "kapsamda" değerlendirilir. Özellikle allrdeps
ve rbuildfiles
operatörleri yalnızca bu kapsamdaki sonuçları döndürür.
--infer_universe_scope
, Bazel'a sorgu ifadesinden --universe_scope
için bir değer çıkarmasını söyler. Tahmin edilen bu değer, sorgu ifadesindeki benzersiz hedef kalıplarının listesidir ancak istediğiniz bu olmayabilir. Örneğin:
bazel query --infer_universe_scope --order_output=no "allrdeps(//my:target)"
Bu sorgu ifadesindeki benzersiz hedef kalıplarının listesi ["//my:target"]
olduğundan Bazel bunu çağrı ile aynı şekilde ele alır:
bazel query --universe_scope=//my:target --order_output=no "allrdeps(//my:target)"
Ancak --universe_scope
ile yapılan bu sorgunun sonucu yalnızca //my:target
olur. //my:target
türünün ters bağımlılıklarının hiçbiri, oluşturma yoluyla evrende değildir. Öte yandan şunları da göz önünde bulundurun:
bazel query --infer_universe_scope --order_output=no "tests(//a/... + b/...) intersect allrdeps(siblings(rbuildfiles(my/starlark/file.bzl)))"
Bu, tanımı belirli bir .bzl
dosyasını kullanan hedeflere geçişli olarak bağlı olan bazı dizinlerdeki hedeflerin tests
genişletmesindeki test hedeflerini hesaplamaya çalışan anlamlı bir sorgu çağrısıdır. Burada --infer_universe_scope
, özellikle --universe_scope
seçiminin başka şekilde sorgu ifadesini sizin ayrıştırmanızı gerektireceği durumlarda kullanışlıdır.
Bu nedenle, allrdeps
ve rbuildfiles
gibi evren kapsamlı operatörler kullanan sorgu ifadeleri için --infer_universe_scope
yalnızca istediğiniz davranışı sergiliyorsa kullanmanız gerekir.
Sky Query'nin varsayılan sorguya göre bazı avantajları ve dezavantajları vardır. Ana dezavantajı, çıktılarını grafik sırasına göre sıralayamadığı ve bu nedenle belirli çıktı biçimlerinin yasaklanmasıdır. Bunun avantajı, varsayılan sorguda bulunmayan iki operatör (allrdeps
ve rbuildfiles
) sağlamasıdır.
Ayrıca Sky Query, yeni bir grafik oluşturmak yerine Skyframe grafiğinin içini inceleyerek çalışır. Varsayılan olarak bu şekilde bir grafik oluşturulur. Bu nedenle, daha hızlı olduğu ve daha az bellek kullandığı
bazı durumlar vardır.
İfadeler: Dilbilgisinin söz dizimi ve anlambilim
Bu, EBNF gösterimiyle ifade edilen Bazel sorgu dilinin dil bilgisidir:
expr ::= word
| let name = expr in expr
| (expr)
| expr intersect expr
| expr ^ expr
| expr union expr
| expr + expr
| expr except expr
| expr - expr
| set(word *)
| word '(' int | word | expr ... ')'
Aşağıdaki bölümlerde bu gramerin her bir üretimi sırayla açıklanmıştır.
Hedef kalıpları
expr ::= word
Sözdizimsel olarak, hedef kalıp yalnızca bir kelimeden oluşur. Bir dizi (sıralanmamış) hedef
olarak yorumlanır. En basit hedef kalıbı, tek bir hedefi (dosya veya kural) tanımlayan bir etikettir. Örneğin, //foo:bar
hedef kalıbı bir öğe (hedef) ve bar
kuralını içeren bir kümeyi değerlendirir.
Hedef kalıpları, paketler ve hedefler üzerine joker karakterler eklemek için etiketleri genelleştirir. Örneğin, foo/...:all
(veya yalnızca foo/...
), foo
dizininin altında bulunan ve her paketteki tüm kuralları tekrarlı olarak içeren bir kümeyi değerlendiren bir hedef kalıptır. bar/baz:all
, bar/baz
paketindeki tüm kuralları içeren bir kümeyi değerlendiren, ancak alt paketlerini kapsamayan bir hedef kalıbıdır.
Benzer şekilde foo/...:*
, foo
dizininin altında yinelemeli olarak her paketteki tüm hedefleri (kurallar ve dosyaları) içeren bir kümeyi değerlendiren bir hedef kalıbıdır. bar/baz:*
, bar/baz
paketindeki tüm hedefleri içeren, ancak alt paketlerini içeren bir kümeyi değerlendirir.
:*
joker karakteri, dosyaların yanı sıra kurallarla da eşleştiğinden sorgular için genellikle :all
karakterinden daha yararlıdır. Buna karşılık, :all
joker karakteri (foo/...
gibi hedef kalıplarda örtülü) genellikle derlemeler için daha yararlıdır.
bazel query
hedef kalıpları, bazel build
derleme hedefleriyle aynı şekilde çalışır. Daha fazla bilgi için Hedef Kalıpları bölümüne bakın veya bazel help target-syntax
yazın.
Hedef kalıpları, tekil bir kümeye (etikette olması durumunda), birçok öğe içeren bir kümeye (binlerce öğe içeren foo/...
durumunda olduğu gibi) veya hedef kalıp hiçbir hedefle eşleşmiyorsa boş kümeye dönüşebilir.
Bir hedef kalıbı ifadesi sonucunda ortaya çıkan tüm düğümler, bağımlılık ilişkisine göre birbirine göre doğru şekilde sıralanır. Dolayısıyla, foo:*
sonucu yalnızca foo
paketindeki hedef grubu değildir, aynı zamanda bu hedefler üzerindeki bir grafik de olur. (Sonuç düğümlerinin diğer düğümlere göre göreli sıralamasıyla ilgili herhangi bir garanti verilmez.) Daha fazla ayrıntı için grafik sırası bölümüne bakın.
Değişkenler
expr ::= let name = expr1 in expr2
| $name
Bazel sorgu dili, değişkenlerin tanımlanmasına ve bunlara referans verilmesine olanak tanır. let
ifadesinin değerlendirmesinin sonucu, expr2 değişkeninin değerlendirmesiyle aynıdır; name değişkeninin tüm serbest durumları expr1 değeriyle değiştirilir.
Örneğin, let v = foo/... in allpaths($v, //common) intersect $v
, allpaths(foo/...,//common) intersect foo/...
ile eşdeğerdir.
Çevreleyen let name = ...
ifadesi dışında bir değişken referansı name
olması hatadır. Diğer bir deyişle, üst düzey sorgu ifadelerinde serbest değişkenler bulunamaz.
Yukarıdaki dil bilgisi üretimlerinde name
, word gibidir ancak C programlama dilinde yasal tanımlayıcı olması ek kısıtlaması vardır. Değişken referanslarının başına "$" karakteri eklenmelidir.
Her let
ifadesi yalnızca tek bir değişken tanımlar, ancak bunları iç içe yerleştirebilirsiniz.
Hem hedef kalıplar hem de değişken referansları yalnızca tek bir jetondan veya bir kelimeden oluşur ve söz dizimi belirsizliği ortaya çıkar. Bununla birlikte, herhangi bir anlam belirsizliği yoktur, çünkü yasal değişken adları olan kelimelerin alt kümesi, yasal hedef kalıpları olan kelime alt kümesinden ayrıdır.
Teknik açıdan, let
ifadeleri sorgu dilinin ifade gücünü artırmaz: Dilde ifade edilebilen tüm sorgular, bu ifadeler olmadan da ifade edilebilir. Ancak bu uygulamalar, birçok sorgunun kısa ve öz olmasını sağlar ve sorgu değerlendirmesinin daha verimli olmasını sağlar.
Parantez içindeki ifadeler
expr ::= (expr)
Parantezler bir değerlendirme sırasını zorlamak için alt ifadeleri ilişkilendirir. Parantez içindeki bir ifade, bağımsız değişkeninin değerini değerlendirir.
Cebirsel küme işlemleri: kesişim, bütün, fark kümesi
expr ::= expr intersect expr
| expr ^ expr
| expr union expr
| expr + expr
| expr except expr
| expr - expr
Bu üç operatör, olağan set işlemlerini kendi bağımsız değişkenleri üzerinden hesaplar.
Her operatörün intersect
gibi nominal bir ve ^
gibi sembolik bir biçim olmak üzere iki biçimi vardır. Her iki biçim de eşdeğerdir; sembolik
biçimler daha hızlı yazılır. (Daha açık şekilde belirtmek gerekirse bu sayfanın geri kalanında nominal biçimler kullanılmıştır.)
Örneğin,
foo/... except foo/bar/...
foo/...
ile eşleşen, ancak foo/bar/...
ile eşleşmeyen hedef grubunu değerlendirir.
Aynı sorguyu şu şekilde yazabilirsiniz:
foo/... - foo/bar/...
intersect
(^
) ve union
(+
) işlemleri değişmelidir (simetrik);
except
(-
) asimetriktir. Ayrıştırıcı, bu üç operatörün tümünü sol-ilişkisel olarak ve eşit öncelikte işler, bu nedenle parantez kullanmanız gerekebilir. Örneğin, bu ifadelerden ilk ikisi eşdeğerdir, ancak üçüncüsü eşdeğer değildir:
x intersect y union z
(x intersect y) union z
x intersect (y union z)
Harici bir kaynaktan okuma hedefleri: ayarlayın
expr ::= set(word *)
set(a b c ...)
operatörü, sıfır veya daha fazla hedef kalıplarının boşlukla (virgülsüz) ayrılmış olarak birleşimini hesaplar.
set()
, Bourne kabuğunun $(...)
özelliğiyle birlikte, bir sorgunun sonuçlarını normal bir metin dosyasında kaydetme, bu metin dosyasını diğer programlar (standart UNIX kabuğu araçları gibi) kullanarak değiştirme ve ardından sonucu, işleme için bir değer olarak tekrar sorgu aracına sunma anlamına gelir. Örneğin:
bazel query deps(//my:target) --output=label | grep ... | sed ... | awk ... > foo
bazel query "kind(cc_binary, set($(<foo)))"
Aşağıdaki örnekte kind(cc_library, deps(//some_dir/foo:main, 5))
,bir awk
programı kullanılarak maxrank
değerlerine göre filtre uygulanarak hesaplanmıştır.
bazel query 'deps(//some_dir/foo:main)' --output maxrank | awk '($1 < 5) { print $2;} ' > foo
bazel query "kind(cc_library, set($(<foo)))"
Bu örneklerde $(<foo)
, $(cat foo)
için bir kısaltmadır ancak önceki awk
komutu gibi cat
dışındaki kabuk komutları da kullanılabilir.
İşlevler
expr ::= word '(' int | word | expr ... ')'
Sorgu dili çeşitli işlevleri tanımlar. İşlevin adı, gerektirdiği bağımsız değişkenlerin sayısını ve türünü belirler. Aşağıdaki işlevler kullanılabilir:
allpaths
attr
buildfiles
rbuildfiles
deps
filter
kind
labels
loadfiles
rdeps
allrdeps
same_pkg_direct_rdeps
siblings
some
somepath
tests
visible
Bağımlılıkların geçici olarak kapatılması: deps
expr ::= deps(expr)
| deps(expr, depth)
deps(x)
operatörü, x bağımsız değişken grubunun bağımlılıklarının geçişli olarak kapatılmasıyla oluşturulan grafiği değerlendirir. Örneğin, deps(//foo)
değeri, tüm bağımlılıkları dahil olmak üzere foo
tek düğümünden alınan bağımlılık grafiğidir. deps(foo/...)
değeri, kökleri foo
dizininin altındaki her pakette bulunan tüm kurallardan oluşan bağımlılık grafikleridir. Bu bağlamda, "bağımlılıklar" yalnızca kural ve dosya hedefleri anlamına gelir. Bu nedenle, bu hedefleri oluşturmak için gereken BUILD
ve Starlark dosyaları burada yer almamaktadır. Bunun için buildfiles
operatörünü kullanmanız gerekir.
Ortaya çıkan grafik, bağımlılık ilişkisine göre sıralanır. Daha fazla ayrıntı için grafik sırası bölümüne bakın.
deps
operatörü, isteğe bağlı ikinci bir bağımsız değişkeni kabul eder. Bu bağımsız değişken, aramanın derinliğinde bir üst sınırı belirten bir tam sayıdır. Dolayısıyla deps(foo:*, 0)
, foo
paketindeki tüm hedefleri döndürürken deps(foo:*, 1)
, foo
paketindeki herhangi bir hedefin doğrudan ön koşullarını da içerir ve deps(foo:*, 2)
, deps(foo:*, 1)
içindeki düğümlerden doğrudan ulaşılabilen düğümleri de içerir ve bu şekilde devam eder. (Bu sayılar, minrank
çıkış biçiminde gösterilen sıralamalara karşılık gelir.)
depth parametresi atlanırsa arama sınırsız olur: Ön koşulların dönüşlü geçişli kapanmasını hesaplar.
Ters bağımlılıkların geçici olarak kapatılması: rdeps
expr ::= rdeps(expr, expr)
| rdeps(expr, expr, depth)
rdeps(u, x)
operatörü, u evren grubunun geçişli kapanması dahilinde x bağımsız değişkeni grubunun ters bağımlılıklarını değerlendirir.
Ortaya çıkan grafik, bağımlılık ilişkisine göre sıralanır. Daha fazla ayrıntı için grafik sırası ile ilgili bölüme bakın.
rdeps
operatörü, isteğe bağlı üçüncü bir bağımsız değişkeni kabul eder. Bu bağımsız değişken, aramanın derinliğinde bir üst sınırı belirten bir tam sayıdır. Ortaya çıkan grafik, yalnızca bağımsız değişken kümesindeki herhangi bir düğümden belirtilen derinlikteki düğümleri içerir. Dolayısıyla rdeps(//foo, //common, 1)
, //foo
'in geçişli kapanmasında doğrudan //common
öğesine bağlı olan tüm düğümleri değerlendirir. (Bu sayılar, minrank
çıkış biçiminde gösterilen sıralamalara karşılık gelir.) depth parametresi atlanırsa arama sınırsız olur.
Tüm ters bağımlılıkların geçici olarak kapatılması: allrdeps
expr ::= allrdeps(expr)
| allrdeps(expr, depth)
allrdeps
operatörü, rdeps
operatörü gibi davranır ancak "evren grubu", --universe_scope
işaretinin değeri ayrı olarak belirtilmez. Dolayısıyla, --universe_scope=//foo/...
iletildiyse allrdeps(//bar)
, rdeps(//foo/..., //bar)
değerine eşdeğerdir.
Aynı pakette doğrudan ters bağımlılıklar: same_pkg_direct_rdeps
expr ::= same_pkg_direct_rdeps(expr)
same_pkg_direct_rdeps(x)
operatörü, bağımsız değişken kümesindeki bir hedefle aynı pakette bulunan ve doğrudan ona bağlı olan hedef grubunun tamamını değerlendirir.
Bir hedefin paketiyle ilgilenme: kardeşler
expr ::= siblings(expr)
siblings(x)
operatörü, bağımsız değişken grubundaki bir hedefle aynı paketteki hedef grubunun tamamını değerlendirir.
Rastgele seçim: bazı
expr ::= some(expr)
| some(expr, count )
some(x, k)
operatörü, x bağımsız değişken kümesinden rastgele olarak en fazla k hedefi seçer ve yalnızca bu hedefleri içeren bir kümeyi değerlendirir. k parametresi isteğe bağlıdır. Eksikse sonuç, rastgele seçilen yalnızca bir hedef içeren bir tekil dizi olur. x bağımsız değişken grubunun boyutu k değerinden küçükse x bağımsız değişken grubunun tamamı döndürülür.
Örneğin, some(//foo:main union //bar:baz)
ifadesi, //foo:main
veya //bar:baz
içeren bir tekil küme olarak değerlendirilir. Ancak bu küme tanımlanmamış olur. some(//foo:main union //bar:baz, 2)
veya some(//foo:main union //bar:baz, 3)
ifadesi hem //foo:main
hem de //bar:baz
değerini döndürür.
Bağımsız değişken bir tekil ise some
, kimlik işlevini hesaplar: some(//foo:main)
, //foo:main
değerine eşdeğerdir.
Belirtilen bağımsız değişken grubu, some(//foo:main intersect //bar:baz)
ifadesinde olduğu gibi boşsa bir hata oluştu.
Yol operatörleri: somepath, allpaths
expr ::= somepath(expr, expr)
| allpaths(expr, expr)
somepath(S, E)
ve allpaths(S, E)
operatörleri, iki hedef grubu arasındaki yolları hesaplar. Her iki sorgu da bir başlangıç noktası S ve bir dizi bitiş noktası E olmak üzere iki bağımsız değişkeni kabul eder. somepath
, S bölgesindeki bir hedeften E içindeki bir hedefe bazı rastgele yol üzerindeki düğümlerin grafiğini döndürür. allpaths
, S içindeki herhangi bir hedefin tüm yollarındaki düğümlerin grafiğini E içindeki herhangi bir hedefe döndürür.
Ortaya çıkan grafikler bağımlılık ilişkisine göre sıralanır. Daha fazla ayrıntı için grafik sırası ile ilgili bölüme bakın.
somepath(S1 + S2, E) , bir olası sonuç. |
somepath(S1 + S2, E) , başka bir olası sonuç. |
allpaths(S1 + S2, E) |
Hedef tür filtrelemesi: tür
expr ::= kind(word, expr)
kind(pattern, input)
operatörü, bir hedef grubuna filtre uygular ve beklenen türde olmayan hedefleri siler. pattern parametresi, ne tür bir hedefin eşleneceğini belirtir.
Örneğin, aşağıda gösterilen BUILD
dosyası tarafından tanımlanan dört hedefin (p
paketi için) türleri tabloda gösterilmektedir:
Kod | Hedef | Tür |
---|---|---|
genrule( name = "a", srcs = ["a.in"], outs = ["a.out"], cmd = "...", ) |
//p:a |
genrule kuralı |
//p:a.in |
kaynak dosya | |
//p:a.out |
oluşturulan dosya | |
//p:BUILD |
kaynak dosya |
Bu nedenle, kind("cc_.* rule", foo/...)
, foo
altındaki tüm cc_library
, cc_binary
vb. kural hedeflerinin grubu olarak değerlendirilir. kind("source file", deps(//foo))
ise //foo
hedefinin bağımlılıklarının geçişli olarak kapatılmasındaki tüm kaynak dosyaları grubuna göre değerlendirme yapar.
pattern bağımsız değişkeninin tırnak içine alınması genellikle gereklidir, çünkü bu bağımsız değişken olmadan source
file
ve .*_test
gibi birçok normal ifade ayrıştırıcı tarafından kelime olarak kabul edilmez.
package group
için eşleşme yapılırken, :all
ile biten hedefler hiçbir sonuç vermeyebilir. Bunun yerine :all-targets
politikasını kullanın.
Hedef adı filtreleme: filtre
expr ::= filter(word, expr)
filter(pattern, input)
operatörü, bir hedef grubuna filtre uygular ve etiketleri (mutlak formda) kalıpla eşleşmeyen hedefleri atar; girişlerinin bir alt kümesini değerlendirir.
Birinci bağımsız değişken olan pattern, hedef adlar üzerinde normal ifade içeren bir kelimedir. Bir filter
ifadesi, x tüm hedeflerini içeren kümeye değerlendirilir. Bu şekilde x, input kümesinin üyesidir ve x etiketi (mutlak biçimde, //foo:bar
gibi mutlak biçimde) pattern normal ifadesi için (bağlanmamış) eşleşme içerir. Tüm hedef adlar //
ile başladığından ^
normal ifade bağlantısına alternatif olarak kullanılabilir.
Bu operatör genellikle intersect
operatörüne çok daha hızlı ve daha güçlü bir alternatif sağlar. Örneğin, //foo:foo
hedefinin tüm bar
bağımlılıklarını görmek için yeni bir dönüşüm hedefi
deps(//foo) intersect //bar/...
Ancak bu ifade, bar
ağacındaki tüm BUILD
dosyalarının ayrıştırılmasını gerektirir. Bu işlem yavaş olur ve alakasız BUILD
dosyalarında hatalara neden olabilir. Bunun bir alternatifi de olabilir:
filter(//bar, deps(//foo))
Bu işlem önce //foo
bağımlılık grubunu hesaplar, ardından yalnızca sağlanan kalıpla eşleşen hedefleri filtreler. Diğer bir ifadeyle, alt dize olarak //bar
içeren adlara sahip hedefler.
filter(pattern,
expr)
operatörünün yaygın olarak kullanılan bir başka kullanımı da belirli dosyaları adlarına veya uzantılarına göre filtrelemektir. Örneğin,
filter("\.cc$", deps(//foo))
//foo
derlemek için kullanılan tüm .cc
dosyanın listesini sağlayacak.
Kural özelliği filtreleme: attr
expr ::= attr(word, word, expr)
attr(name, pattern, input)
operatörü, bir hedef grubuna filtre uygular ve kural olmayan hedefleri, name özelliği tanımlı olmayan kural hedeflerini veya özellik değerinin sağlanan normal ifadeyle pattern eşleşmediği kural hedeflerini atar. Girişlerinin bir alt kümesini değerlendirir.
Birinci bağımsız değişken olan name, sağlanan normal ifade kalıbıyla eşleşmesi gereken kural özelliğinin adıdır. İkinci bağımsız değişken olan pattern, özellik değerleri üzerindeki normal bir ifadedir. attr
ifadesi tüm hedefleri içeren x grubunu değerlendirir. Böylece x, input kümesinin üyesidir, name tanımlı özelliğine sahip bir kuraldır ve özellik değeri pattern normal ifadesi için (bağlanmamış) eşleşme içerir. name isteğe bağlı bir özellikse ve kural bunu açıkça belirtmiyorsa karşılaştırma için varsayılan özellik değeri kullanılır. Örneğin,
attr(linkshared, 0, deps(//foo))
bir linkshared özelliğine (cc_binary
kuralı gibi) izin verilen tüm //foo
bağımlılıklarını seçer ve bu bağımlılığı açıkça 0 olarak ayarlar ya da varsayılan değer 0 dışında hiç ayarlamaz (ör. cc_binary
kuralları için).
Liste türü özellikleri (ör. srcs
, data
vb.) [
paranteziyle başlayan, ]
ayracı ile biten ve birden çok değeri sınırlamak için ",
" (virgül, boşluk) kullanılarak [value<sub>1</sub>, ..., value<sub>n</sub>]
biçiminde dizelere dönüştürülür.
Etiketler, etiketin mutlak biçimi kullanılarak dizelere dönüştürülür. Örneğin, bir deps=[":foo",
"//otherpkg:bar", "wiz"]
özelliği [//thispkg:foo, //otherpkg:bar, //thispkg:wiz]
dizesine dönüştürülür.
Köşeli parantezler her zaman mevcuttur. Bu nedenle, boş liste eşleştirme amacıyla []
dize değerini kullanır. Örneğin,
attr("srcs", "\[\]", deps(//foo))
boş bir srcs
özelliğine sahip //foo
bağımlılıklar arasından
tüm kuralları seçerken
attr("data", ".{3,}", deps(//foo))
data
özelliğinde en az bir değer belirten //foo
bağımlılıkları arasından tüm kuralları seçer (//
ve :
nedeniyle her etiket en az 3 karakter uzunluğundadır).
Bir liste türü özelliğinde belirli bir value
içeren //foo
bağımlılıkları arasından tüm kuralları seçmek için
attr("tags", "[\[ ]value[,\]]", deps(//foo))
value
tarihinden önceki karakter [
veya bir boşluk, value
karakterinden sonraki karakter ise virgül ya da ]
olacağından bu yöntem işe yarar.
Kural görünürlüğü filtreleme: görünür
expr ::= visible(expr, expr)
visible(predicate, input)
operatörü, bir hedef grubuna filtre uygular ve gerekli görünürlüğe sahip olmayan hedefleri siler.
Birinci bağımsız değişken olan predicate, çıkıştaki tüm hedeflerin görünür olması gereken bir hedef kümesidir. Bir visible ifadesi, x tüm hedeflerini içeren bir küme olarak değerlendirilir. Böylece x, input kümesinin bir üyesi olur ve predicate x içindeki tüm hedefler y tarafından görülebilir.y Örneğin:
visible(//foo, //bar:*)
, görünürlük kısıtlamalarını ihlal etmeden //bar
paketindeki //foo
ürününün bağımlı olabileceği tüm hedefleri seçecek.
Etiket türünün kural özelliklerinin değerlendirilmesi: etiketler
expr ::= labels(word, expr)
labels(attr_name, inputs)
operatörü, inputs grubundaki bazı kurallarda "label" veya "list of label" türündeki attr_name özelliğinde belirtilen hedef grubunu döndürür.
Örneğin labels(srcs, //foo)
, //foo
kuralının srcs
özelliğinde görünen hedef grubunu döndürür. inputs kümesinde srcs
özelliklerine sahip birden fazla kural varsa srcs
özelliklerinin birleşimi döndürülür.
test_suites: testlerini genişletin ve filtreleyin
expr ::= tests(expr)
tests(x)
operatörü, x kümesindeki tüm test kuralları grubunu döndürür, tüm test_suite
kurallarını başvurduğu bağımsız test grubuna genişletir, tag
ve size
ölçütlerine göre filtreleme uygular.
Varsayılan olarak, sorgu değerlendirmesi tüm test_suite
kurallarındaki test dışı hedefleri yoksayar. Bu, --strict_test_suite
seçeneği kullanılarak hatalar olarak değiştirilebilir.
Örneğin, kind(test, foo:*)
sorgusu foo
paketindeki tüm *_test
ve test_suite
kurallarını listeler. Tüm sonuçlar (tanım olarak) foo
paketinin üyeleridir. Buna karşılık tests(foo:*)
sorgusu, bazel test
foo:*
tarafından yürütülecek tüm bağımsız testleri döndürür: Buna, test_suite
kuralları aracılığıyla doğrudan veya dolaylı olarak referans verilen diğer paketlere ait olan testler de dahil olabilir.
Paket tanımı dosyaları: derleme dosyaları
expr ::= buildfiles(expr)
buildfiles(x)
operatörü, x kümesindeki her bir hedefin paketlerini tanımlayan dosya grubunu döndürür. Diğer bir deyişle, her paket için BUILD
dosyasını ve load
aracılığıyla başvuruda bulunduğu .bzl dosyalarını döndürür. Bunun, bu load
dosyalarını içeren paketlerin BUILD
dosyalarını da döndürdüğünü unutmayın.
Bu operatör, genellikle belirtilen bir hedef oluşturmak için hangi dosyaların veya paketlerin gerekli olduğunu belirlerken kullanılır (genellikle aşağıdaki --output package
seçeneğiyle birlikte). Örneğin,
bazel query 'buildfiles(deps(//foo))' --output package
//foo
öğesinin geçişli olarak bağlı olduğu tüm paketlerin grubunu döndürür.
Paket tanımı dosyaları: rbuildfiles
expr ::= rbuildfiles(word, ...)
rbuildfiles
operatörü, yol parçalarının virgülle ayrılmış listesini alır ve bu yol parçalarına geçişli olarak bağlı olan BUILD
dosya grubunu döndürür. Örneğin, //foo
bir paketse rbuildfiles(foo/BUILD)
, //foo:BUILD
hedefini döndürür. foo/BUILD
dosyasında load('//bar:file.bzl'...
varsa rbuildfiles(bar/file.bzl)
, //foo:BUILD
hedefinin yanı sıra //bar:file.bzl
yükleyen diğer BUILD
dosyalarının hedeflerini de döndürür.
--universe_scope
işaretiyle belirtilen evrendir. Doğrudan BUILD
ve .bzl
dosyalarına karşılık gelmeyen dosyalar sonuçları etkilemez. Örneğin, kaynak dosyalar (foo.cc
gibi) BUILD
dosyasında açıkça belirtilse bile yoksayılır. Ancak sembolik bağlantılara saygı duyulur. foo/BUILD
, bar/BUILD
için kullanılan sembolik bir bağlantıysa rbuildfiles(bar/BUILD)
, sonuçlarına //foo:BUILD
ifadesini ekler.
rbuildfiles
operatörü, neredeyse ahlaki olarak buildfiles
operatörünün tersidir. Bununla birlikte, bu ahlaki ters çevirme bir yönde daha güçlüdür: rbuildfiles
çıktıları, buildfiles
girdileri gibidir; birincisi paketlerde yalnızca BUILD
dosya hedefleri içerir, ikincisi ise bu tür hedefleri içerebilir. Diğer yöndeyse yazışma daha zayıftır. buildfiles
operatörünün çıkışları, tüm paketlere veBelirli bir giriş için gereken bzl
dosya. Bununla birlikte, rbuildfiles
operatörünün girişleri bu hedefler değil, bu hedeflere karşılık gelen yol parçalarıdır.
Paket tanımı dosyaları: yükleme dosyaları
expr ::= loadfiles(expr)
loadfiles(x)
operatörü, x kümesindeki her bir hedefin paketlerini yüklemek için gereken Starlark dosya grubunu döndürür. Diğer bir deyişle, her paket için BUILD
dosyalarından başvurulan .bzl dosyalarını döndürür.
Çıkış biçimleri
bazel query
bir grafik oluşturur.
bazel query
ürününün bu grafiği sunduğu içeriği, biçimi ve sıralamayı --output
komut satırı seçeneği aracılığıyla belirlersiniz.
Gökyüzü Sorgusu ile çalışırken, yalnızca sıralanmamış çıkışla uyumlu çıkış biçimlerine izin verilir. Özellikle graph
, minrank
ve maxrank
çıkış biçimleri yasaktır.
Bazı çıkış biçimleri ek seçenekleri kabul eder. Her çıkış seçeneğinin adında, geçerli olduğu çıkış biçiminin önüne eklenir. Bu nedenle --graph:factored
, yalnızca --output=graph
kullanılırken geçerli olur. graph
dışında bir çıkış biçimi kullanılırsa herhangi bir etkisi olmaz. Benzer şekilde, --xml:line_numbers
yalnızca --output=xml
kullanılırken geçerlidir.
Sonuçların sıralaması hakkında
Sorgu ifadeleri her zaman "grafik düzeninin korunumu yasası"na uygun olsa da, sonuçların bağımlılık sıralı veya sırasız biçimde sunulması yapılabilir. Bu, sonuç kümesindeki hedefleri veya sorgunun hesaplanma şeklini etkilemez. Yalnızca sonuçların Stdout'a nasıl yazdırıldığını etkiler. Ayrıca, bağımlılık sırasında eş değer olan düğümler alfabetik olarak sıralanmış veya alfabetik olarak sıralanmamış olabilir.
Bu davranışı kontrol etmek için --order_output
işareti kullanılabilir.
(--[no]order_results
işareti, --order_output
işaretinin işlevlerinin bir alt kümesini içerir ve kullanımdan kaldırılmıştır.)
Bu işaretin varsayılan değeri auto
olup sonuçları sözlük sıralaması olarak yazdırır. Ancak somepath(a,b)
kullanıldığında sonuçlar deps
sırasına göre yazdırılır.
Bu işaret no
ve --output
işareti build
, label
, label_kind
, location
, package
, proto
veya
xml
olduğunda çıktılar rastgele sırayla yazdırılır. Bu genellikle en hızlı seçenektir. Ancak --output
; graph
, minrank
veya maxrank
olduğunda desteklenmez: Bu biçimlerde, Bazel her zaman sonuçları bağımlılık sırasına veya sıralamasına göre sıralanmış şekilde yazdırır.
Bu işaret deps
olduğunda Bazel baskıları bazı topolojik sıralamayla, yani önce bağımlılıklar ile sonuçlanır. Bununla birlikte, bağımlılık sırasına göre sıralanmayan (ikisinden diğerine yol olmadığı için) düğümler herhangi bir sırada yazdırılabilir.
Bu işaret full
olduğunda, Bazel düğümleri tamamen belirleyici (toplam) bir sırada yazdırır.
Öncelikle, tüm düğümler alfabetik olarak sıralanır. Daha sonra, listedeki her düğüm, sipariş sonrası derinlik öncelikli aramanın başlangıcı olarak kullanılır. Ziyaret edilmeyen düğümlere giden kenarlar, takip eden düğümlerin alfabetik sırasına göre geçer. Son olarak, düğümler ziyaret edilen sıranın tersi yönde yazdırılır.
Bu sıradaki düğümler daha yavaş olabilir. Bu nedenle yalnızca determinizm önemli olduğunda kullanılmalıdır.
Hedeflerin kaynak biçimini, DERLEME işleminde görünecekleri şekilde yazdırın
--output build
Bu seçenekte, her hedef DERLEME dilinde elle yazılmış gibi temsil edilir. Tüm değişkenler ve işlev çağrıları (glob, makrolar gibi) genişletildiğinden Starlark makrolarının etkisini görebilirsiniz. Buna ek olarak, her bir geçerli kural, geçerli kuralı oluşturmak için değerlendirilen makronun adını vererek bir generator_name
ve/veya generator_function
değeri bildirir.
Çıkış, BUILD
dosyalarıyla aynı söz dizimini kullansa da geçerli bir BUILD
dosyası üretileceği garanti edilmez.
Her bir hedefin etiketini yazdır
--output label
Bu seçenekte, elde edilen grafikteki her bir hedefin ad kümesi (veya etiketleri) topolojik sırada, her satıra bir etiket olacak şekilde yazdırılır (--noorder_results
belirtilmezse sonuçların sıralamasıyla ilgili notlara bakın).
(Topolojik sıralama, bir grafik düğümünün tüm haleflerinden önce göründüğü sıralamadır.) Elbette bir grafiğin birçok topolojik sıralaması vardır (ters posta sıralaması yalnızca bir tanedir). Hangisinin seçileceği belirtilmemiştir.
Bir somepath
sorgusunun çıktısını yazdırırken, düğümlerin yazdırıldığı sıra yol sırasıdır.
Dikkat: Bazı durumlarda aynı etikete sahip iki farklı hedef olabilir. Örneğin, sh_binary
kuralı ve tek (örtülü) srcs
dosyası foo.sh
olarak adlandırılabilir. Bir sorgu sonucu bu hedeflerin ikisini de içeriyorsa çıkış (label
biçiminde) bir kopya içeriyormuş gibi görünür. label_kind
(aşağıya bakın) biçimi
kullanıldığında, fark netlik kazanır: İki hedef aynı ada, ancak birinin sh_binary rule
türüne ve diğerinin source file
türüne sahiptir.
Her bir hedefin etiketini ve türünü yazdırın
--output label_kind
label
gibi, bu çıktı biçimi de sonuç grafiğindeki her bir hedefin etiketlerini topolojik sırada yazdırır, ancak ek olarak hedefin türü ile etiketten önce gelir.
Hedefleri protokol arabelleği biçiminde yazdır
--output proto
Sorgu çıkışını QueryResult
protokol arabelleği olarak yazdırır.
Hedefleri uzunlukla ayrılmış protokol arabelleği biçiminde yazdır
--output streamed_proto
Target
protokol arabellekleri için uzunlukla sınırlandırılmış bir akış yazdırır. Bu, tek bir alana sığmayacak çok fazla hedef olduğunda protokol arabelleklerinde (i)boyut sınırlamalarının
nedenini atlatmak için faydalıdır.QueryResult
veya çıktı işlenmeye devam ederken
Hedefleri metin protokolü biçiminde yazdır
--output textproto
--output proto
operatörüne benzer şekilde QueryResult
protokol arabelleğini metin biçiminde yazdırır.
Hedefleri ndjson biçiminde yazdırma
--output streamed_jsonproto
--output streamed_proto
yöntemine benzer şekilde, Target
protokol arabellekleri akışını ancak ndjson biçiminde yazdırır.
Her hedefin etiketini sıralama düzeninde yazdır
--output minrank --output maxrank
label
gibi, minrank
ve maxrank
çıkış biçimleri de ortaya çıkan grafikte her bir hedefin etiketlerini yazdırır, ancak bunlar topolojik sırada görünmek yerine sıralama sırasında ve öncesinde sıra numarasıyla görünür. Bunlar, sonuç sıralaması --[no]order_results
işaretinden etkilenmez (sonuçların sıralamasıyla ilgili notlar).
Bu biçimin iki varyantı vardır: minrank
her düğümü kök düğümden kendisine giden en kısa yolun uzunluğuna göre sıralar.
"Kök" düğümler (gelen kenarları olmayanlar) 0. sırada, halefleri 1. sıradadır. (Her zaman olduğu gibi, kenarlar bir hedeften ön koşullarını, yani bağlı olduğu hedeflere işaret eder.)
maxrank
her düğümü kök düğümden kendisine giden en uzun yolun uzunluğuna göre sıralar. Yine "köklerin" sıralaması 0'dır. Diğer tüm düğümlerin sıralaması, önceki tüm düğümlerinin maksimum sıralamasından bir daha yüksektir.
Bir döngüdeki tüm düğümlerin sıralaması eşit olarak kabul edilir. (Çoğu grafik çevrimseldir ancak BUILD
dosyaları hatalı döngüler içerdiğinden döngüler basitçe gerçekleşir.)
Bu çıkış biçimleri, bir grafiğin ne kadar derin olduğunun keşfedilmesine yardımcı olur. deps(x)
, rdeps(x)
veya allpaths
sorgusunun sonucu için kullanılırsa sıralama numarası, ilgili sıralamadaki bir düğüme giden en kısa (minrank
ile) veya en uzun (maxrank
ile) yolun uzunluğuna eşit olur.x
maxrank
, bir hedef oluşturmak için gereken derleme adımlarının en uzun sırasını belirlemek amacıyla kullanılabilir.
Örneğin, soldaki grafik, --output minrank
ve --output maxrank
belirtildiğinde sağdaki çıktıları verir.
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 |
Her bir hedefin konumunu yazdır
--output location
label_kind
işlevinde olduğu gibi, bu seçenek de sonuçtaki her bir hedef için hedefin türünü ve etiketini yazdırır ancak hedefin konumunu dosya adı ve satır numarası olarak açıklayan bir dize ön ekine eklenir. Biçim, grep
çıktısına benziyor. Böylece, ikinci kodu ayrıştırabilen (Emacs veya vi gibi) araçlar, bir dizi eşleşmeyi adım adım görmek için sorgu çıkışını da kullanabilir. Böylece, Bazel sorgu aracı bağımlılık-grafiğe duyarlı "DERLEME dosyaları için grep" olarak kullanılabilir.
Konum bilgileri, hedef türüne göre değişiklik gösterir (tür operatörüne bakın). Kurallar söz konusu olduğunda, kural bildiriminin BUILD
dosyasındaki konumu yazdırılır.
Kaynak dosyalarda, gerçek dosyanın 1. satırı yazdırılır. Oluşturulan bir dosyayı oluşturan kuralın konumu yazdırılır. (Sorgu aracı, oluşturulan dosyanın gerçek konumunu bulmak için yeterli bilgiye sahip değildir ve henüz bir derleme gerçekleştirilmemişse her durumda konum bilgisi olmayabilir.)
Paket grubunu yazdırın
--output package
Bu seçenek, sonuç kümesindeki bir hedefin ait olduğu tüm paketlerin adını yazdırır. Adlar sözlük sıralamasına göre yazılır; kopyalar hariç tutulur. Resmî olarak bu, etiket grubundan (paket, hedef) paketlere yapılan bir projeksiyondur.
Harici depolardaki paketler @repo//foo/bar
, ana depodaki paketler ise foo/bar
olarak biçimlendirilir.
Bu çıkış seçeneği, deps(...)
sorgusuyla birlikte belirli bir hedef grubu oluşturmak için satın alınması gereken paket grubunu bulmak için kullanılabilir.
Sonucun grafiğini görüntüleme
--output graph
Bu seçenek, sorgu sonucunun popüler AT&T GraphViz biçiminde yönlendirilen bir grafik olarak yazdırılmasına neden olur. Genelde sonuç .png
veya .svg
gibi bir dosyaya kaydedilir.
(dot
programı iş istasyonunuzda yüklü değilse sudo apt-get install graphviz
komutunu kullanarak yükleyebilirsiniz.)
Örnek bir çağrı için aşağıdaki örnek bölümüne bakın.
Bu çıkış biçimi, özellikle allpaths
, deps
veya rdeps
sorguları için yararlıdır. Sonuçta, --output label
gibi doğrusal bir biçimde oluşturulduğunda kolayca görselleştirilemeyen bir yol grubu bulunur.
Grafik, varsayılan olarak faktoriye biçimde oluşturulur. Yani, topolojik olarak eşdeğer olan düğümler birden fazla etikete sahip tek bir düğümde birleştirilir. Tipik sonuç grafikleri çok sayıda yinelenen kalıplar içerdiğinden, grafiği daha kısa ve okunabilir hale getirirsiniz. Örneğin, bir java_library
kuralı, tümü aynı genrule
tarafından oluşturulan yüzlerce Java kaynak dosyasına bağlı olabilir. Faktörlere dayalı grafikte, tüm bu dosyalar tek bir düğümle temsil edilir. Bu davranış, --nograph:factored
seçeneğiyle devre dışı bırakılabilir.
--graph:node_limit n
Bu seçenek, çıkıştaki bir grafik düğümü için etiket dizesinin maksimum uzunluğunu belirtir. Daha uzun etiketler kısaltılır; -1 değeri, kesmeyi devre dışı bırakır. Grafiklerin genellikle yazdırıldığı biçimdeki düğüm etiketleri çok uzun olabilir. GraphViz, bu seçeneğin varsayılan değeri olan 1024 karakteri aşan etiketleri işleyemez. --output=graph
kullanılmadığı sürece bu seçeneğin hiçbir etkisi yoktur.
--[no]graph:factored
Grafikler, varsayılan olarak yukarıda açıklandığı gibi çarpanlara ayrılmış biçimde görüntülenir.
--nograph:factored
belirtildiğinde, grafikler çarpanlara ayırmadan yazdırılır. Bu, GraphViz kullanarak görselleştirmeyi pratik hale getirir ancak daha basit biçim, diğer araçlarla (grep gibi) işlemeyi kolaylaştırabilir. --output=graph
kullanılmadığı sürece bu seçeneğin hiçbir etkisi yoktur.
XML
--output xml
Bu seçenek, sonuçta elde edilen hedeflerin XML biçiminde yazdırılmasını sağlar. Çıkış şunun gibi bir XML üstbilgisiyle başlar:
<?xml version="1.0" encoding="UTF-8"?>
<query version="2">
ve daha sonra, sonuç grafiğindeki her hedef için topolojik sırada (sırasız sonuçlar istenmediği sürece) bir XML öğesiyle devam eder ve ardından sonlandırma
</query>
file
türündeki hedefler için basit girişler yayınlanır:
<source-file name='//foo:foo_main.cc' .../>
<generated-file name='//foo:libfoo.so' .../>
Ancak kurallar için XML yapılandırılmıştır ve kuralının BUILD
dosyasında değeri açıkça belirtilmeyenler de dahil olmak üzere kuralın tüm özelliklerinin tanımlarını içerir.
Buna ek olarak sonuç, rule-input
ve rule-output
öğelerini içerir. Böylece bağımlılık grafiğinin topolojisi, örneğin srcs
özelliğinin öğelerinin ileri bağımlılıklar (ön koşullar) ve outs
özelliğinin içeriğinin ise geriye dönük bağımlılıklar (tüketiciler) olduğu bilinmeden yeniden oluşturulabilir.
--noimplicit_deps
belirtilirse dolaylı bağımlılıkların rule-input
öğeleri atlanır.
<rule class='cc_binary rule' name='//foo:foo' ...>
<list name='srcs'>
<label value='//foo:foo_main.cc'/>
<label value='//foo:bar.cc'/>
...
</list>
<list name='deps'>
<label value='//common:common'/>
<label value='//collections:collections'/>
...
</list>
<list name='data'>
...
</list>
<int name='linkstatic' value='0'/>
<int name='linkshared' value='0'/>
<list name='licenses'/>
<list name='distribs'>
<distribution value="INTERNAL" />
</list>
<rule-input name="//common:common" />
<rule-input name="//collections:collections" />
<rule-input name="//foo:foo_main.cc" />
<rule-input name="//foo:bar.cc" />
...
</rule>
Bir hedefin her XML öğesi, değeri hedefin etiketi olan bir name
özelliği ve bir location
özelliği içerir. Bu özellik, hedefin --output location
tarafından yazdırıldığı şekilde hedef konumudur.
--[no]xml:line_numbers
Varsayılan olarak, XML çıktısında görüntülenen konumlar satır numaraları içerir.
--noxml:line_numbers
belirtildiğinde satır numaraları yazdırılmaz.
--[no]xml:default_values
Varsayılan olarak XML çıkışı, değeri söz konusu özellik türü için varsayılan değer olan kural özelliğini içermez (örneğin, BUILD
dosyasında belirtilmemişse veya varsayılan değer açık bir şekilde sağlanmışsa). Bu seçenek, bu tür özellik değerlerinin XML çıkışına dahil edilmesine neden olur.
Normal ifadeler
Sorgu dilindeki normal ifadeler Java normal ifade kitaplığını kullanır. Böylece java.util.regex.Pattern
için tam söz dizimini kullanabilirsiniz.
Harici depolarla sorgulama
Derleme, harici depolardaki (WORKSPACE dosyasında tanımlanan) kurallara dayanıyorsa sorgu sonuçları bu bağımlılıkları içerir. Örneğin //foo:bar
, //external:some-lib
değerine bağımlıysa ve //external:some-lib
@other-repo//baz:lib
öğesine bağlıysa bazel query 'deps(//foo:bar)'
, hem @other-repo//baz:lib
hem de //external:some-lib
öğelerini bağımlılık olarak listeler.
Harici depoların kendileri bir derlemenin bağımlılıkları değildir. Yani yukarıdaki örnekte //external:other-repo
bir bağımlılık değildir. Ancak //external
paketinin üyesi olarak sorgulanabilir. Örneğin:
# Querying over all members of //external returns the repository.
bazel query 'kind(http_archive, //external:*)'
//external:other-repo
# ...but the repository is not a dependency.
bazel query 'kind(http_archive, deps(//foo:bar))'
INFO: Empty results