İç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. Bir pakette (BUILD dosyası) en fazla bir kez kullanılır.
Depo genelindeki her kural için geçerli olan meta verileri açıklayan karşı taraf için, deponuzun kökündeki REPO.bazel
dosyasında repo()
işlevini kullanın.
repo()
işlevi, package()
işleviyle tam olarak aynı bağımsız değişkenleri alır.
package() 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 |
Etiketler listesi; varsayılan değer Bu paketteki kuralların varsayılan görünürlüğü. Bu paketteki her kuralın görünürlük özelliği, kuralın |
default_deprecation |
Dize; varsayılan değer Bu paketteki tüm kurallar için varsayılan
|
default_package_metadata |
Etiketler listesi; varsayılan değer 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 ayarlar. 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österileceğini belirtir. 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 grubu tanımlar ve bir etiketi grupla 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. Gizli olarak görünen bir hedefe yalnızca kendi paketi içinde (alt paketlerde değil) referans verilebilir. Bu iki uç nokta arasında bir hedef, kendi paketine ve bir veya daha fazla paket grubu tarafından açıklanan paketlerin herhangi birine erişime izin verebilir. Görünürlük sisteminin daha ayrıntılı bir açıklaması için visibility ö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 birinde olabilir:
Ayrıca, ilk iki paket spesifikasyonu türü, reddedildiğini belirtmek için önlerine Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ve negatif özelliklerinden hiçbiriyle eşleşmeyen tüm paketleri içerir. Örneğin, Herkese açık görünürlük dışında, mevcut deponun dışındaki paketleri doğrudan belirtmenin bir yolu yoktur. Bu özellik eksikse özelliğin boş bir listeye ayarlanması ile aynıdır. Bu, özelliğin 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 atıfta bulunmalıdır.
Başvurulan paket gruplarındaki paketler bu paket grubunun bir parçası olarak alınır. Bu geçişlidir. Negatif paket özellikleriyle birlikte kullanıldığında, her grup için paket grubunun önce bağımsız olarak hesaplandığını ve ardından sonuçların birleştirildiğini unutmayın. Bu, bir gruptaki reddedilen özelliklerin başka bir gruptaki özellikleri etkilemediği anlamına gelir. |
Örnekler
Aşağıdaki package_group
beyanı, tropikal meyveler içeren "tropikal" adlı bir paket grubu 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 exports_files()
ifadesiyle açıkça dışa aktarılan başka bir pakete ait 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ıştan aktif olarak uzaklaşı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. Hiçbir görünürlük belirtilmezse dosyalar, package
işlevinde paket varsayılan görünürlüğü belirtilmiş olsa bile her paket tarafından görülebilir. Lisanslar da belirtilebilir.
Örnek
Aşağıdaki örnekte, test_data
paketindeki bir metin dosyası olan golden.txt
dışa aktarılır. Böylece diğer paketler bu dosyayı (ör. testlerin data
özelliğinde) kullanabilir.
# 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 bir yardımcı işlevdir. Glob yalnızca kendi paketindeki dosyaları arar ve yalnızca kaynak dosyaları arar (oluşturulan dosyaları veya diğer hedefleri aramaz).
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 desen bir veya daha fazla yol segmentinden oluşabilir. Unix yollarında olduğu gibi, bu segmentler /
ile ayrılır. Segmentler *
joker karakterini içerebilir: Bu karakter, dizin ayırıcı /
hariç olmak üzere yol segmentindeki herhangi bir alt dizeyle (boş alt dize dahil) eşleşir. Bu joker karakter, tek 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 tüm dosyalarla eşleşir (foo/
bir alt paket değilse) foo/a*.htm*
,foo/
dizinindekia
ile başlayan, ardından rastgele bir dize (boş olabilir) içeren, ardından.htm
içeren vefoo/axx.htm
vefoo/a.html
veyafoo/axxx.html
gibi başka bir rastgele dizeyle biten her dosyayı eşleştirir.**/a.txt
, bu paketin her alt klasöründeki 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şturulmuş 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 bir 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. - Glob'lar, alt dizinlerdeki dosyalarla eşleşebilir. Alt dizin adları joker karakter içerebilir. 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 yolunda 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. Yanix/y
adlı bir paket yoksa veya --deleted_packages işaretçisi kullanılarak silinmiş olarak işaretlendiyse aynı glob ifadesix/y/z.cc
değerini 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şir. 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
ile 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 "hariç tut" liste bağımsız değişkenine ekleyin. -
"**" joker karakterinin tek bir özel durumu vardır:
"**"
kalıbı, paketin dizin yoluyla eşleşmez. 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 bir ad hem kendi kendini açıklayan bir ad olur hem de yedek dosyaları veya emacs/vi/... otomatik kaydetme dosyalarını yanlışlıkla eşleştirmenizi önler.
Derleme kuralları yazarken glob öğelerini sayabilirsiniz. Bu sayede, örneğin her giriş için ayrı kurallar oluşturabilirsiniz. Aşağıdaki genişletilmiş glob örneği bölümüne bakın.
Glob Ö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", ], ... )
experimental.txt hariç tüm txt dosyalarını testdata dizinine ekleyin. testdata 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, testdata dizinindeki ve alt dizinlerindeki (ve alt dizinlerinin vb.) tüm txt dosyalarına bağlı 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"]), )
Bu dizindeki ve yolları testing adlı bir dizin içerenler hariç tüm alt dizinlerdeki tüm Java dosyalarından oluşturulmuş bir kitaplık oluşturun. Bu kalıp, mümkünse kullanılmamalıdır. Aksi takdirde, artımlı derleme azaltılabilir ve dolayısıyla derleme süreleri uzayabilir.
java_library( name = "mylib", srcs = glob( ["**/*.java"], exclude = ["**/testing/**"], ), )
Genişletilmiş Glob Örnekleri
Geçerli dizinde *_test.cc için dosyanın satır sayısını sayan ayrı bir genrule 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 pakette a_test.cc, b_test.cc ve c_test.cc adlı üç eşleşen dosya varsa bazel query '//foo:all'
çalıştırıldığında oluşturulan tüm kurallar listelenir:
$ 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 tüm özellik atamalarını değiştirebilir. Bu nedenle 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" modunda mı yoksa "sürüm" modunda mı oluşturulduğuna bağlı olarak farklı kaynaklar yerleştirmek için bu özelliği kullanabilirsiniz.
Temel kullanım şu şekildedir:
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, bir config_setting
veya constraint_value
değerine referans veren bir etikettir. Hedefin yapılandırması beklenen bir değer kümesiyle eşleşirse bu etiket "eşleşir". mytarget#srcs
değeri, geçerli çağrıyla eşleşen etiket listesine dönüşür.
Notlar:
- Her çağrıda tam olarak bir koşul seçilir.
- Birden fazla koşul eşleşirse ve bunlardan biri diğerlerinin uzmanlık alanı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 durum, aşağıdaki 2. örnekte gösterildiği gibi uzmanlık çözümünün bir sıralama oluşturmak için tasarlanmadığı anlamına da 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ğerde olmadığı sürece Bazel bir hatayla başarısız olur.
- Başka hiçbir koşul eşleşmediğinde
//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()
, dosya ve dizinler yerine alt paketleri listeleyenglob()
'a benzer 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.Sonuç olarak döndürülen alt paket listesi sıralı olarak listelenir ve mevcut yükleme paketine göre
exclude
'daki değil,include
'teki belirli kalıplarla eşleşen yollar içerir.Örnek
Aşağıdaki örnekte,
foo/BUILD
paketine ait tüm doğrudan alt paketler listelenmiştir.# 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, kullanıcıların bu işlevi doğrudan çağırmak yerine skylib'in "subpackages" modülünü kullanması tercih edilir.