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. Hemfoo
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:
allpaths
attr
buildfiles
rbuildfiles
deps
filter
kind
labels
loadfiles
rdeps
allrdeps
same_pkg_direct_rdeps
siblings
some
somepath
tests
visible
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.
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
--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.
Her hedefin etiketini yazdır
--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
.
Her bir hedefin etiketini ve türünü yazdır
--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.
Hedefleri protokol arabelleği biçiminde yazdır
--output proto
Sorgu çıkışını
QueryResult
protokol arabelleğine alınır.
Hedefleri uzunlukla sınırlandırılmış protokol arabelleği biçiminde yazdı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.
Hedefleri metin protokolü biçiminde yazdır
--output textproto
--output proto
özelliğine benzer şekilde,
QueryResult
protokol arabelleğinde, ancak
metin biçimini kullanın.
Hedefleri ndjson biçiminde yazdır
--output streamed_jsonproto
--output streamed_proto
özelliğine benzer şekilde, şu akışı yazdırır:
Target
protokol arabellekleridir ancak ndjson biçimindedir.
Her hedefin etiketini sıralama sırasına göre yazdır
--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.
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ır
--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.)
Paket grubunu yazdır
--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