İçindekiler
paket
package(default_deprecation, default_package_metadata, default_testonly, default_visibility, features)
Bu işlev, paketinden yararlanın. Bir pakette (BUILD dosyası) en fazla bir kez kullanılır.
Bütünlükteki her kurala meta verilerin uygulandığını tanımlayan diğer taraf için
depo için repo()
işlevini
REPO.bazel
dosyasını eklemeniz gerekir.
repo()
işlevi, package()
ile tamamen 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 |
Etiket listesi; varsayılan değer Bu paketteki kuralların varsayılan görünürlüğü. Kuralın |
default_deprecation |
String; 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; belirtildiği gibi 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 derleme sistemi üzerinde çalışan kişiler tarafından etiket paketlerinin olması gerekir. Derleme sisteminde ç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 kuralda varsa ayrı görünürlük beyanları 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. Etiket, visibility
özelliklerinde referans olarak kullanılabilir.
Paket grupları, öncelikli olarak görünürlük kontrolü için kullanılır. Herkes tarafından görülebilen bir hedefe, kaynak ağaçtaki her paketten referans verilebilir. Özel olarak Görünür hedefe yalnızca kendi paketi 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 paketlerin sayısı. 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ği ya da diğer özelliklerden birinde zaten mevcut
includes
özelliğinde bahsedilen paket grupları.
Paket grupları teknik olarak hedeflerdir ancak kurallar tarafından oluşturulmaz ve veya görünürlük korumasına sahip değiller.
Bağımsız değişkenler
Özellik | Açıklama |
---|---|
name |
Ad; zorunlu 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 dizesinde aşağıdakilerden biri olabilir formlar:
Ayrıca, ilk iki paket spesifikasyonu türü ayrıca
dikkate alınmadığını belirtmek için Paket grubu,
hiçbir olumsuz özelliği değil, olumlu özellikleri var
Ö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,
Bu, aynı zamanda listeyi içeren bir listeye ayarlamakla aynı şekilde,
yalnızca Not: Bazel 6.0'dan önceki sürümlerde Not: Bazel 6.0'dan önce bu özellik |
includes |
Etiketler listesi; varsayılan değer Bu gruba dahil olan diğer paket grupları. Bu özellikteki etiketler diğer paket gruplarına atıfta bulunmalıdır.
Referans verilen paket gruplarındaki paketler bu paket grubunun bir parçası olarak kabul edilir. Bu ilişki geçişlidir. Reddedilmiş paket özellikleriyle birlikte kullanıldığında her grubun paket kümesi önce bağımsız olarak hesaplanır ve ve sonuçlar birleştirilir. 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 öğenin paket gruplarını belirtir uygulama:
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 olup 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 kurala giriş olarak belirtilen dosyalar da dışa aktarılır
bayrağa kadar varsayılan görünürlükte
--incompatible_no_implicit_file_export
olduğunu varsayalım. 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. CEVAP
görünürlük beyanı da belirtilebilir; bu örnekte 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, sıralanmış bir listesini döndüren bir yardımcı işlevdir. Glob yalnızca dosyaları arar ve yalnızca kaynak dosyalara bakar (oluşturulan dosyaları ya da hedefler).
Dosyanın pakete göre yolu include
kalıplarından herhangi biriyle eşleşiyorsa ve exclude
kalıplarından hiçbiriyle eşleşmiyorsa kaynak dosyanın etiketi sonuca dahil edilir.
include
ve exclude
listeleri yol kalıpları içeriyor
. Her model bir ya da daha fazla
daha fazla yol segmenti 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 birden çok kez kullanılabilir
tek bir yol segmenti içinde. Ayrıca, **
joker karakteri
Sıfır veya daha fazla tam yol segmenti ancak bağımsız olarak tanımlanması gerekir
yol segmenti
foo/bar.txt
,foo/bar.txt
dosyasıyla tam olarak eşleşiyor bu pakettefoo/*.txt
,foo/
dizinindeki tüm dosyalarla eşleşir dosya.txt
(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**/bar/**/*.txt
, elde edilen yolda en az bir dizinbar
olarak adlandırılıyorsa (xxx/bar/yyy/zzz/a.txt
veyabar/a.txt
gibi) bu paketin her alt dizinindeki her.txt
dosyasıyla eşleşir (**
'in sıfır segmentle de eşleştiğini unutmayın) veyabar/zzz/a.txt
**
, bu paketin her alt klasöründeki her dosyayı eşleştirir**
bir segment olarak tek başına yer alması gerektiğindenfoo**/a.txt
geçersiz bir kalıptı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 dosyası değerlendirmesi sırasında çalıştığı içinglob()
yalnızca kaynak ağacınızdaki dosyaları eşleştirir, hiçbir zaman oluşturulan dosyalar. Hem oluşturulan dosyalara ait açık bir listeyi eklemeniz gerekir. glob'a gönderebilirsiniz.: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 bu nedenle diğer kurallardaglob()
kullanma özelliğini (ör.srcs = glob(["*.cc"])
), açık şekilde eşleştirilir. Örneğin,glob()
["Foo.java", "bar/Baz.java"]
sonucunu verirse ancak pakette "Foo.java" adlı bir kural da varsa (buna izin verilir ancak Bazel bu konuda uyarı verir)glob()
'nin tüketicisi "Foo.java" dosyası yerine "Foo.java" kuralını (çıktılarını) kullanır. Görüntüleyin GitHub sorun #10395 bakın. - Glob'lar, alt dizinlerdeki dosyalarla eşleşebilir. Ve alt dizin adları joker karakterli olabilir. Ancak...
-
Etiketlerin paket sınırını aşmasına izin verilmez ve glob, alt paketlerdeki dosyalarla eşleşmez.
Örneğin, paketteki
**/*.cc
glob ifadesix
, şu değerleri içermiyorsax/y/z.cc
içermez:x/y
paket olarak bulunur (x/y/BUILD
veya paket yolunda başka bir yerde). Bu glob ifadesinin sonucunun gerçekte mevcut olması gerekir. Yani aynı glob ifadesix/y/z.cc
x/y
veya --deleted_packages tıklayın. - Yukarıdaki kısıtlama, hangi joker karakterleri kullandıklarına bakılmaksızı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ı birleşik bir desenle eşleştirmek isterseniz deseninizin.
ile başlaması gerekir. Örneğin,*
ve.*.txt
,.foo.txt
ile eşleşecek ancak*.txt
olacak . Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler giriş olarak gerekli olmayan dosyaları içerebilir ve gereksiz yere globblanan dosyaların sayısı ve bellek tüketimi. Gizli dizinleri hariç tutmak için "hariç tut" liste bağımsız değişkenine ekleyin. -
"**" Joker karakterin yalnızca bir köşesinde büyük/küçük harf kullanımı vardır:
"**"
, paketin dizin yoluyla eşleşmiyor. Yani,glob(["**"], exclude_directories = 0)
ifadesinin tüm dosyalarla eşleştiğini söyle ve dizinleri, geçişli olarak yalnızca geçerli paketin dizinindeki dizinler altında birleştirebilirsiniz (tabii ki alt paketlerin dizinlerine girmiyoruz. Önceki not edin).
Genel olarak, uygun bir uzantı (ör. *.html) sağlamaya çalışmanız gerekir. yerine basit bir '*' karakteri kullanın. Daha açık bir ad hem kendi kendini açıklayıcıdır hem de yedek dosyaları veya emacs/vi/... otomatik kayıt dosyalarını yanlışlıkla eşleştirmenizi önler.
Derleme kuralları yazarken glob'un öğelerini numaralandırabilirsiniz. Bu sayede, örneğin her giriş için ayrı kurallar oluşturabilirsiniz. Bkz. expanded glob örneği bölümüne bakın.
Küre Örnekleri
Bu dizindeki tüm Java dosyalarından ve :gen_java_srcs
kuralı tarafından oluşturulan tüm dosyalardan 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. testdata alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız yinelenen 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 tüm Java dosyalarından ve tüm Java dosyalarından oluşturulmuş bir kitaplık oluşturun. alt dizinleri (yolu test adlı bir dizin içerenler hariç) Oluşturmayı azaltabileceğinden, mümkünse bu kalıptan kaçınılmalıdır. artırır ve derleme sürelerini artırır.
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 paket üç tane içeriyorsa
eşleşen dosyalar, a_test.cc, b_test.cc ve c_test.cc ardından çalışıyor
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 tüm özellik atamalarını değiştirebilir. Bu nedenle değeri, komut satırı Bazel işaretlerine bağlıdır.
Örneğin bunu, platforma özgü bağımlılıkları tanımlamak ya da
Bir kuralın "geliştirici" içinde yerleşik olup olmadığına bağlı olarak farklı kaynaklar yerleştirmek
- "yayınlama" yatırım yapmanız önemlidir.
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, 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 bir sh_binary
öğesinin srcs
özelliğini 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 koşuluyla aynı işaretlere ve kısıtlama değerlerine sahipse ve bazı ek işaretler veya kısıtlama değerlerine sahipse A koşulunun bir uzmanlığı olarak kabul edilir. Bu ayrıca uzmanlaşma çözümlemesinin, yalnızca aşağıdaki Örnek 2'de gösterilmiştir.
- Birden fazla koşul eşleşiyorsa ve bir koşul tüm koşulların Diğer durumlarda, tüm koşullar aynı değerde çözümlenmediği sürece Bazel bir hata vererek başarısız olur.
- Başka bir koşul eşleşmezse özel sözde etiket
//conditions:default
'ün eşleştiği kabul edilir. Bu koşul dışarıda bırakıldığında, hatadan kaçınmak için başka bir kuralın eşleşmesi gerekir. select
, daha büyük bir alanın içine yerleştirilebilir özellik ataması. Dolayısıylasrcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})
vesrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})
, geçerli ifadelerdir.select
, özelliklerin çoğuyla ancak tamamıyla çalışmaz. Uyumsuz özellikleri, 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 ekleme ile ilgili ayrıntılı açıklama ve örnekler için glob'a bakın. modelleri hariç tutun.Döndürülen alt paketler listesi, sıralanmış haldedir ve verilen kalıplarla eşleşen geçerli yükleme paketine göre yolları
include
(exclude
kapsamındakiler hariç).Örnek
Aşağıdaki örnekte,
foo/BUILD
paketine ait tüm doğrudan alt paketler 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, kullanıcıların bu işlevi doğrudan çağırmak yerine skylib'in "subpackages" modülünü kullanması tercih edilir.