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ı bu karakterlerle başlayabilse de tırnak işaretiyle belirtilmeyen kelimeler kısa çizgi-
veya yıldız işareti*
ile başlayamaz. Harici depolara atıfta bulunan etiketlerin işlenmesini basitleştirmek için özel bir kural olarak,@@
ile başlayan tırnaksız kelimeler+
karakterleri içerebilir.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 ve operatörler, normal kelimeler olarak değerlendirilir. Örneğin,
some
bir anahtar kelime, "bazı" ise 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ı 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ülere karşı sağlamdır ve döngüleri hata olarak bildirmez.
Yükleme sonrası aşamada, üzerinde işlem yapılan yapılandırılmamış hedef grafiğin, yapılandırılmış hedef grafikte bulunmayan döngüler içerebileceğini unutmayın. bazel query
Yapılandırılmış hedef grafikteki döngüler bazel cquery
ve bazel aquery
tarafından hata olarak algılanır ve bildirilir.
Ö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. Örtülü bağımlılıklar şu şekilde tanımlanabilir:
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, olası araç zinciri uygulamalarının bağımlılık olarak kabul edilmediğini, yalnızca gerekli araç zinciri türlerinin bağımlılık olarak kabul edildiğini unutmayın. Toolchain belgelerine bakı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:
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ç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(S1 + S2, E) , olası bir sonuç. |
somepath(S1 + S2, E) , başka bir olası sonuç. |
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.
Bir sözlük türü özelliğinde //foo
bağımlılıkları arasında belirli bir key
ve value
ile tüm kuralları seçmek için
attr("some_dict_attribute", "[\{ ]key=value[,\}]", deps(//foo))
Bu durumda, //foo
şu şekilde tanımlanmışsa //foo
seçilir:
some_rule(
name = "foo",
some_dict_attribute = {
"key": "value",
},
)
Bu, key=value
işaretinden önceki karakterin {
veya boşluk, key=value
işaretinden sonraki karakterin ise virgül veya }
olması nedeniyle ç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, load
ed 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.
--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ırayla (yani önce bağımlılar, sonra 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.
Her hedefin etiketini yazdırma
--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.
somepath
Sorgu çı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.
Her hedefin etiketini ve türünü yazdırma
--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.
Protokol arabelleği biçimindeki yazdırma hedefleri
--output proto
Sorgu çıkışını QueryResult
protokol arabelleği olarak yazdırır.
Uzunlukla sınırlanmış protokol arabelleği biçiminde yazdırma hedefleri
--output streamed_proto
Target
protokol arabelleklerinin uzunlukla sınırlanmış akışını yazdırır. Bu, (i) tek bir QueryResult
dosyasına sığamayacak kadar çok hedef olduğunda protokol arabelleklerinin boyut sınırlamalarını aşmak veya (ii) Bazel hâlâ çıktı verirken işlemeye başlamak için kullanışlıdır.
Metin proto biçimindeki yazdırma hedefleri
--output textproto
--output proto
'ya benzer şekilde, QueryResult
protokol arabelleğini metin biçiminde yazdırır.
ndjson biçiminde yazdırma hedefleri
--output streamed_jsonproto
--output streamed_proto
'ya benzer şekilde, Target
protokol arabellekleri akışını ndjson biçiminde yazdırır.
Her hedefin etiketini, sıralama düzeninde yazdırın.
--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.
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 hedefin konumunu yazdırma
--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.)
Paket grubunu yazdırma
--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 sorgu sonuçları bu bağımlılıkları içerir. Örneğin, //foo:bar
, @other-repo//baz:lib
öğesine bağlıysa bazel query 'deps(//foo:bar)'
, @other-repo//baz:lib
öğesini bağımlılık olarak listeler.