İçindekiler
paket
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
Bu işlev, paketteki her kural için geçerli olan meta verileri tanımlar. Paket (BUILD dosyası) içinde en fazla bir kez kullanılır.
Depodaki her kurala meta verilerin uygulandığını beyan eden eşdeğeri için deponuzun kök konumundaki REPO.bazel
dosyasında repo()
işlevini kullanın.
repo()
işlevi, package()
ile tamamen aynı bağımsız değişkenleri alır.
Bundle() işlevi, dosyanın üst kısmındaki tüm load() ifadelerinden hemen sonra, herhangi bir kuraldan önce çağrılmalıdır.
Bağımsız değişkenler
Özellik | Açıklama |
---|---|
default_applicable_licenses |
|
default_visibility |
Etiket listesi; varsayılan Bu paketteki kuralların varsayılan görünürlüğü. Bu paketteki her kural, |
default_deprecation |
Dize; varsayılan değer Bu paketteki tüm kurallar için varsayılan
|
default_package_metadata |
Etiket listesi; varsayılan Paketteki diğer tüm hedefler için geçerli olan meta veri hedeflerinin varsayılan listesini belirler. Bunlar genellikle OSS paket ve lisans beyanlarıyla ilgili hedeflerdir. Örnekler için rules_license bölümüne bakın. |
default_testonly |
Boole; belirtilen durumlar dışında varsayılan değer Bu paketteki tüm kurallar için varsayılan
|
features |
Liste dizeleri; varsayılan değer: Bu BUILD dosyasının anlamını etkileyen çeşitli işaretler belirler. Bu özellik genellikle özel bir işleme ihtiyacı olan paketleri etiketlemek için derleme sistemi üzerinde çalışan kişiler tarafından kullanılır. Derleme sistemi üzerinde çalışan biri tarafından açıkça istenmediği sürece bunu kullanmayın. |
Örnekler
Aşağıdaki beyan, bu paketteki kuralların yalnızca//foo:target
paket grubunun üyelerine görünür olduğunu bildirir. Bir kuraldaki bağımsız görünürlük bildirimleri (varsa) bu spesifikasyonu geçersiz kılar.
package(default_visibility = ["//foo:target"])
package_group
package_group(name, packages, includes)
Bu işlev, bir paket grubunu tanımlar ve bir etiketi kümeyle ilişkilendirir. Etikete, visibility
özelliklerinde referans verilebilir.
Paket grupları, öncelikli olarak görünürlük kontrolü için kullanılır. Herkese açık bir hedefe, kaynak ağaçtaki her paketten referans verilebilir. Özel olarak görünür bir hedefe yalnızca kendi paketinin içinde referans verilebilir (alt paketlerde değil). Bu uç noktalar arasında bir hedef, kendi paketine ve bir veya daha fazla paket grubu tarafından açıklanan paketlere erişime izin verebilir. Görünürlük sisteminin daha ayrıntılı açıklaması için görünürlük özelliğine bakın.
Belirli bir paket, packages
özelliğiyle eşleşiyorsa veya includes
özelliğinde belirtilen diğer paket gruplarından birinde zaten yer alıyorsa grupta kabul edilir.
Paket grupları teknik olarak hedeflerdir ancak kurallar tarafından oluşturulmaz ve kendileri herhangi bir görünürlük korumasına sahip değildir.
Bağımsız değişkenler
Özellik | Açıklama |
---|---|
name |
Ad; gerekli Bu hedef için benzersiz bir ad. |
packages |
Dize listesi; varsayılan değer: Sıfır veya daha fazla paket spesifikasyonu içeren bir liste. Her paket spesifikasyonu dizesi, aşağıdaki biçimlerden birine sahip olabilir:
Buna ek olarak, paket spesifikasyonlarının ilk iki türü, bunların reddedildiğini belirtmek için Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ve negatif özelliklerinden hiçbirini içermeyen herhangi bir paket içerir. Örneğin Mevcut deponun dışındaki paketleri herkese açık görünürlüğün dışında doğrudan belirtmek mümkün değildir. Bu özellik eksikse boş bir listeye ayarlamakla aynıdır. Bu, özelliği yalnızca Not: Bazel 6.0'dan önce Not: Bazel 6.0'dan önce, bu özellik |
includes |
Etiket listesi; varsayılan Buna dahil olan diğer paket grupları. Bu özellikteki etiketler diğer paket gruplarına başvuruda bulunmalıdır.
Başvurulan paket gruplarındaki paketler bu paket grubunun bir parçası olarak alınır. Bu geçişlidir. Yok sayılan paket özellikleriyle birlikte kullanıldığında, her bir grubun paket kümesinin önce bağımsız olarak hesaplandığını ve sonuçların daha sonra birleştirildiğini unutmayın. Bu, bir gruptaki reddedilen spesifikasyonların başka bir gruptaki spesifikasyonlar üzerinde etkisi olmadığı anlamına gelir. |
Örnekler
Aşağıdaki package_group
bildirimi, tropik meyveler içeren "tropik" adlı bir paket grubunu belirtir.
package_group( name = "tropical", packages = [ "//fruits/mango", "//fruits/orange", "//fruits/papaya/...", ], )
Aşağıdaki beyanlar kurgusal bir uygulamanın paket gruplarını belirtir:
package_group( name = "fooapp", includes = [ ":controller", ":model", ":view", ], ) package_group( name = "model", packages = ["//fooapp/database"], ) package_group( name = "view", packages = [ "//fooapp/swingui", "//fooapp/webui", ], ) package_group( name = "controller", packages = ["//fooapp/algorithm"], )
exports_files
exports_files([label, ...], visibility, licenses)
exports_files()
, bu pakete ait olan ve diğer paketlere aktarılan dosyaların listesini belirtir.
Bir paketin BUILD dosyası, yalnızca bir exports_files()
ifadesiyle açıkça dışa aktarılan başka bir pakete ait olan kaynak dosyalara doğrudan referans verebilir. Dosyaların görünürlüğü hakkında daha fazla bilgi edinin.
Eski bir davranış olarak, bir kuralda girdi olarak bahsedilen dosyalar da --incompatible_no_implicit_file_export
bayrağı değiştirilene kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranışa güvenilmemeli ve bu davranış aktif bir şekilde kullanımdan kaldırılmalıdır.
Bağımsız değişkenler
Bağımsız değişken, geçerli paketteki dosya adlarının bir listesidir. Görünürlük beyanı da belirtilebilir. Bu durumda, dosyalar belirtilen hedefler tarafından görülebilir. Görünürlük belirtilmezse package
işlevinde paketin varsayılan görünürlüğü belirtilmiş olsa bile dosyalar her paket tarafından görülebilir. Lisanslar da belirtilebilir.
Örnek
Aşağıdaki örnekte, diğer paketlerin (örneğin testlerin data
özelliğinde) kullanabilmesi için test_data
paketinden bir metin dosyası olan golden.txt
dışa aktarılmaktadır.
# from //test_data/BUILD exports_files(["golden.txt"])
glob
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Glob, belirli yol kalıplarıyla eşleşen tüm dosyaları bulan ve yollarının yeni, değiştirilebilir ve sıralanmış bir listesini döndüren yardımcı bir işlevdir. Glob yalnızca kendi paketindeki dosyaları arar ve yalnızca kaynak dosyaları (oluşturulan dosyaları veya diğer hedefleri değil) arar.
Bir kaynak dosyanın Etiketi, dosyanın pakete bağlı yolu include
kalıplarından herhangi biriyle eşleşiyor ve exclude
kalıplarından hiçbiriyle eşleşiyorsa sonuca dahil edilir.
include
ve exclude
listeleri, mevcut paketle göreceli yol kalıpları içerir. Her kalıp, bir veya daha fazla
yol segmentinden oluşabilir. Unix yollarında her zaman olduğu gibi, bu segmentler /
ile ayrılır. Segmentler *
joker karakterini içerebilir: Bu, /
dizin ayırıcısı hariç yol segmentindeki herhangi bir alt dizeyle (boş alt dize dahil) eşleşir. Bu joker karakter, bir yol segmentinde birden çok kez kullanılabilir. Ayrıca, **
joker karakteri sıfır veya daha fazla tam yol segmentiyle eşleşebilir ancak bağımsız bir yol segmenti olarak bildirilmelidir.
foo/bar.txt
, bu pakettekifoo/bar.txt
dosyasıyla tam olarak eşleşir- Dosya
.txt
ile bitiyorsafoo/*.txt
,foo/
dizinindeki her dosyayla eşleşir (foo/
bir alt paket değilse) foo/a*.htm*
,foo/
dizinindea
ile başlayan, sonra rastgele bir dizeye (boş olabilir) ve.htm
öğesine sahip olup başka bir rastgele dizeyle (ör.foo/axx.htm
vefoo/a.html
veyafoo/axxx.html
) biten her dosyayla eşleşir.**/a.txt
, bu paketin her alt dizinindeki hera.txt
dosyasıyla eşleşir- Sonuçta elde edilen yoldaki en az bir dizine
bar
denirse**/bar/**/*.txt
(**
değerinin de sıfır segmentle eşleştiğini unutmayın) veyabar/zzz/a.txt
, bu paketin her alt dizinindeki her.txt
dosyasıyla eşleşir.xxx/bar/yyy/zzz/a.txt
bar/a.txt
**
, bu paketin her alt dizinindeki her dosyayla eşleşirfoo**/a.txt
geçersiz bir kalıptır çünkü**
bir segment olarak kendi başına bulunmalıdır
exclude_directories
bağımsız değişkeni etkinleştirilirse (1 olarak ayarlanırsa) dizin türündeki dosyalar sonuçlardan çıkarılır (varsayılan 1).
allow_empty
bağımsız değişkeni False
olarak ayarlanırsa sonuç boş liste olacaksa glob
işlevi hata verir.
Birkaç önemli sınırlama ve uyarı vardır:
-
glob()
, BUILD dosya değerlendirmesi sırasında çalıştırıldığındanglob()
yalnızca kaynak ağacınızdaki dosyaları eşleştirir, hiç oluşturulmamış dosyalardır. Hem kaynak hem de oluşturulmuş dosyaları gerektiren bir hedef oluşturuyorsanız oluşturulan dosyaların açık bir listesini glob'a eklemeniz gerekir.:mylib
ve:gen_java_srcs
ile ilgili aşağıdaki örneğe bakın. -
Bir kural, eşleşen kaynak dosyayla aynı ada sahipse dosyayı "gölgeler".
Bunu anlamak için
glob()
işlevinin bir yol listesi döndürdüğünü ve dolayısıyla diğer kuralların özelliğinde (ör.srcs = glob(["*.cc"])
)glob()
kullanmanın, eşleşen yolların açık bir şekilde listelenmesi ile aynı etkiye sahip olduğunu unutmayın. Örneğinglob()
,["Foo.java", "bar/Baz.java"]
döndürüyorsa ancak pakette "Foo.java" adlı bir kural da varsa (Bazel bu konuda uyarıda bulunsa da buna izin verilir)glob()
tüketicisi, "Foo.java" dosyası yerine "Foo.java" kuralını (çıkışları) kullanır. Daha ayrıntılı bilgi için GitHub sorun #10395 bölümüne bakın. - Küreler, alt dizinlerdeki dosyaları eşleştirebilir. Alt dizin adlarına joker karakterler de eklenebilir. Ancak...
-
Etiketlerin paket sınırını aşmasına izin verilmez ve glob, alt paketlerdeki dosyalarla eşleşmez.
Örneğin,
x/y
paket olarak mevcutsa (x/y/BUILD
olarak veya paket yolundaki başka bir yerde)x
paketindeki**/*.cc
glob ifadesix/y/z.cc
değerini içermez. Bu, glob ifadesinin sonucunun aslında BUILD dosyalarının varlığına bağlı olduğu anlamına gelir. Yani,x/y
adlı bir paket yoksa veya --deleted_packages işareti kullanılarak silindi olarak işaretlenmişse aynı glob ifadesix/y/z.cc
öğesini içerir. - Yukarıdaki kısıtlama, hangi joker karakterleri kullanırsa kullansın tüm glob ifadeleri için geçerlidir.
-
Dosya adı
.
ile başlayan gizli bir dosya, hem**
hem de*
joker karakterleriyle tamamen eşleşiyor. Gizli bir dosyayı bileşik bir kalıpla eşleştirmek istiyorsanız deseninizin.
ile başlaması gerekir. Örneğin,*
ve.*.txt
,.foo.txt
ile eşleşir ancak*.txt
eşleşmez. Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler, giriş olarak gerekli olmayan dosyaları içerebilir ve gereksiz bir şekilde globb olan dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için bunları "hariç tut" listesi bağımsız değişkenine ekleyin. -
"**" joker karakterinin bir köşesinde büyük/küçük harf kullanımı vardır:
"**"
kalıbı, paketin dizin yoluyla eşleşmiyor. Yaniglob(["**"], exclude_directories = 0)
, tüm dosya ve dizinleri yalnızca geçerli paketin dizinindeki geçişli olarak eşleştirir (ancak alt paketlerin dizinlerine girmez; bununla ilgili önceki nota bakın).
Genel olarak, bir glob kalıbı için çıplak "*" kullanmak yerine uygun bir uzantı (ör. *.html) sağlamayı denemelisiniz. Daha açık olan ad, hem belgelemeyi sağlar hem de yedek dosyaları veya emacs/vi/... otomatik kaydetme dosyalarını yanlışlıkla eşleştirmenizi engeller.
Derleme kuralları yazarken glob'un öğelerini numaralandırabilirsiniz. Bu sayede her giriş için ayrı kurallar oluşturulabilir. Aşağıdaki genişletilmiş glob örneği bölümüne bakın.
Küre Örnekleri
Bu dizindeki tüm Java dosyalarından ve :gen_java_srcs
kuralıyla oluşturulan tüm dosyalardan oluşturulmuş bir Java kitaplığı oluşturun.
java_library( name = "mylib", srcs = glob(["*.java"]) + [":gen_java_srcs"], deps = "...", ) genrule( name = "gen_java_srcs", outs = [ "Foo.java", "Bar.java", ], ... )
deneysel.txt hariç dizin test verilerindeki tüm txt dosyalarını dahil edin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız özyinelemeli bir glob (**) kullanın.
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob( ["testdata/*.txt"], exclude = ["testdata/experimental.txt"], ), )
Yinelemeli Küre Örnekleri
Testin, testverileri dizinindeki ve bunun alt dizinlerindeki (ve bunların alt dizinlerindeki vb.) tüm txt dosyalarına dayalı olmasını sağlayın. BUILD dosyası içeren alt dizinler yoksayılır. (Yukarıdaki sınırlamalara ve uyarılara bakın.)
sh_test( name = "mytest", srcs = ["mytest.sh"], data = glob(["testdata/**/*.txt"]), )
Yolu test adlı bir dizin içerenler hariç, bu dizindeki ve tüm alt dizinlerdeki tüm Java dosyalarından derlenmiş bir kitaplık oluşturun. Derleme artışını azaltıp derleme sürelerini artırabileceğinden, mümkünse bu kalıptan kaçınılmalıdır.
java_library( name = "mylib", srcs = glob( ["**/*.java"], exclude = ["**/testing/**"], ), )
Genişletilmiş Yerküre Örnekleri
Geçerli dizinde, *_test.cc için dosyadaki satır sayısını sayan ayrı bir genel oluşturun.
# Conveniently, the build language supports list comprehensions. [genrule( name = "count_lines_" + f[:-3], # strip ".cc" srcs = [f], outs = ["%s-linecount.txt" % f[:-3]], cmd = "wc -l $< >$@", ) for f in glob(["*_test.cc"])]
Yukarıdaki BUILD dosyası //foo paketindeyse ve paket üç eşleşen dosya (a_test.cc, b_test.cc ve c_test.cc) içeriyorsa bazel query '//foo:all'
, oluşturulan tüm kuralları listeler:
$ bazel query '//foo:all' | sort //foo:count_lines_a_test //foo:count_lines_b_test //foo:count_lines_c_test
seç
select( {conditionA: valuesA, conditionB: valuesB, ...}, no_match_error = "custom message" )
select()
, kural özelliğini yapılandırılabilir hale getiren yardımcı işlevdir.
Neredeyse herhangi bir özellik atamasının sağ tarafını değiştirebilir. Böylece değeri komut satırı Bazel işaretlerine bağlıdır.
Örneğin, platforma özgü bağımlılıkları tanımlamak veya bir kuralın "geliştirici" ya da "yayın" modunda derlenmiş olmasına bağlı olarak farklı kaynakları yerleştirmek için bunu kullanabilirsiniz.
Temel kullanım aşağıdaki gibidir:
sh_binary( name = "mytarget", srcs = select({ ":conditionA": ["mytarget_a.sh"], ":conditionB": ["mytarget_b.sh"], "//conditions:default": ["mytarget_default.sh"] }) )
Bu, sh_binary
öğesinin srcs
özelliğini, normal etiket listesi atamasını, yapılandırma koşullarını eşleşen değerlerle eşleyen bir select
çağrısıyla değiştirerek yapılandırılabilir hale getirir. Her koşul, config_setting
veya constraint_value
için bir etiket referansıdır. Bu referanslar, hedefin yapılandırması beklenen bir değer grubuyla eşleşirse "eşleşir". Böylece mytarget#srcs
değeri, geçerli çağrıyla eşleşen etiket listesi haline gelir.
Notlar:
- Herhangi bir çağrıda tam olarak bir koşul seçildi.
- Birden fazla koşul eşleşiyorsa ve koşullardan biri diğerlerinin uzmanlığıysa uzmanlık önceliklidir. B koşulu, A ile aynı flag'lere ve kısıtlama değerlerine ve bazı ek işaretlere ya da kısıtlama değerlerine sahipse A koşulunun uzmanlığı olarak kabul edilir. Bu aynı zamanda, uzmanlık çözümlemesinin aşağıdaki 2. Örnek'te gösterildiği gibi bir sıralama oluşturacak şekilde tasarlanmadığı anlamına gelir.
- Birden fazla koşul eşleşiyorsa ve bir koşul diğer tüm koşulların uzmanlığı arasında değilse tüm koşullar aynı değere sahip olmadığı sürece Bazel bir hatayla başarısız olur.
- Başka hiçbir koşul eşleşmediği takdirde
//conditions:default
özel sözde etiketi, eşleşecek şekilde kabul edilir. Bu koşul dışarıda bırakılırsa hata olmaması için başka bir kuralın eşleşmesi gerekir. select
, daha büyük bir özellik atamasının içine yerleştirilebilir. Dolayısıylasrcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})
vesrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})
, geçerli ifadelerdir.select
, tüm özelliklerle olmasa da çoğu özellikle çalışır. Uyumsuz özellikler, dokümanlarındanonconfigurable
olarak işaretlenmiştir.alt paketler
subpackages(include, exclude=[], allow_empty=True)
subpackages()
, dosyalar ve dizinler yerine alt paketleri listeleyenglob()
gibi bir yardımcı işlevdir.glob()
ile aynı yol kalıplarını kullanır ve şu anda yüklenen BUILD dosyasının doğrudan alt öğesi olan tüm alt paketlerle eşleşebilir. Dahil etme ve hariç tutma kalıplarıyla ilgili ayrıntılı açıklama ve örnekler için glob bölümüne bakın.Döndürülen alt paketlerin sonuç olarak sıralandığı liste, sıralı sırada olup
exclude
içinde değil,include
içinde belirtilen kalıplarla eşleşen geçerli yükleme paketine göre yollar içerir.Örnek
Aşağıdaki örnekte
foo/BUILD
paketinin tüm doğrudan alt paketleri listelenmektedir# The following BUILD files exist: # foo/BUILD # foo/bar/baz/BUILD # foo/sub/BUILD # foo/sub/deeper/BUILD # # In foo/BUILD a call to subs = subpackages(include = ["**"]) # results in subs == ["sub", "bar/baz"] # # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of # 'foo'
Genel olarak, bu işlevi doğrudan çağırmak yerine kullanıcıların skylib'in "subpackages" modülünü kullanması tercih edilir.