İç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 bildirir. Bir paket (BUILD dosyası) içinde en fazla bir kez kullanılır.
Meta verinin tüm depodaki her kurala uygulandığını bildiren meta veri deposu için deponuzun kök kısmındaki REPO.bazel
dosyasında bulunan repo()
işlevini kullanın.
repo()
işlevi, package()
ile 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 |
Etiket listesi; varsayılan değer: Bu paketteki kuralların varsayılan görünürlüğü. Bu paketteki her kural, bu özellikte belirtilen görünürlüğe sahiptir (aksi belirtilmedikçe kuralın |
default_deprecation |
Dize; varsayılan değer: Bu paketteki tüm kurallar için varsayılan
|
default_package_metadata |
Etiket listesi; varsayılan değer: Paketteki diğer tüm hedefler için geçerli olan meta veri hedeflerinin varsayılan listesini ayarlar. Bunlar genellikle OSS paketi ve lisans beyanlarıyla ilgili hedeflerdir. Örnekler için rules_license öğesine bakın. |
default_testonly |
Boole; belirtilenler hariç varsayılan değer Bu paketteki tüm kurallar için varsayılan
|
features |
Liste dizeleri; varsayılan değer: Bu DERLEME dosyasının anlamını etkileyen çeşitli işaretler ayarlar. Bu özellik genellikle özel işlem gerektiren paketleri etiketlemek için derleme sisteminde ç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 beyanda, bu paketteki kuralların yalnızca//foo:target
paket grubunun üyeleri tarafından görülebileceği belirtilmektedir. 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 grupla ilişkilendirir. Etikete visibility
özelliklerinde referans verilebilir.
Paket grupları temel 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ünür bir hedefe yalnızca kendi paketinde referans verilebilir (alt paketlere izin verilmez). Bu uç noktalar arasında bir hedef, kendi paketine ve bir veya daha fazla paket grubu tarafından tanımlanan herhangi bir pakete erişime izin verebilir. Görünürlük sistemiyle ilgili daha ayrıntılı açıklama için görünürlük özelliğine bakın.
Belirli bir paket, packages
özelliğiyle eşleşiyor veya includes
özelliğinde belirtilen diğer paket gruplarından birinde bulunuyorsa grupta olarak kabul edilir.
Paket grupları teknik olarak hedeflerdir ancak kurallar tarafından oluşturulmaz ve görünürlük korumasına sahip değildir.
Bağımsız değişkenler
Özellik | Açıklama |
---|---|
name |
Ad; zorunlu Bu hedef için benzersiz bir ad. |
packages |
Dize listesi; varsayılan: Sıfır veya daha fazla paket özelliğinden oluşan bir liste. Her paket spesifikasyonu dizesi, aşağıdaki biçimlerden birine sahip olabilir:
Ayrıca ilk iki paket spesifikasyonu türünün, ters tutulduklarını belirtmek için önünde Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ancak negatif özelliklerinden hiçbiriyle eşleşen bir paket içeriyor. Ö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 boş bir listeye ayarlamak, yalnızca Not: Bazel 6.0'dan önce Not: Bu özellik, Bazel 6.0'dan önce |
includes |
Etiket listesi; varsayılan değer: Buna dahil olan diğer paket grupları. Bu özellikteki etiketler diğer paket gruplarına referans vermelidir.
Başvurulan paket gruplarındaki paketler, bu paket grubunun parçası olarak alınır. Bu, geçişli bir durumdur. Reddedilen paket özellikleriyle birlikte kullanıldığında, her bir grup için paket grubunun önce bağımsız olarak hesaplandığını ve daha sonra sonuçların birlikte birleştirildiğini unutmayın. Bu, bir gruptaki reddedilen spesifikasyonların başka bir gruptaki spesifikasyonlar üzerinde herhangi bir 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 bildirimler 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()
, diğer paketlere aktarılan, bu pakete ait dosyaların listesini belirtir.
Bir paketin DERLEME dosyası, yalnızca exports_files()
ifadesiyle açıkça dışa aktarılan başka bir pakete ait kaynak dosyalara doğrudan başvuruda bulunabilir. Dosyaların görünürlüğü ile ilgili daha fazla bilgi edinin.
Eski bir davranış olarak, bir kurala girdi olarak bahsedilen dosyalar da --incompatible_no_implicit_file_export
işareti açılana kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranışa güvenilmemeli ve etkin bir şekilde taşınmamalıdır.
Bağımsız değişkenler
Bağımsız değişken, geçerli paketteki dosyaların adlarının bir listesidir. Görünürlük bildirimi de 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 örnek, test_data
paketinden bir metin dosyası olan golden.txt
'i dışa aktarır. Böylece diğer paketler bu dosyayı örneğin, testlerin data
özelliğinde kullanabilir.
# from //test_data/BUILD exports_files(["golden.txt"])
yerküre
glob(include, exclude=[], exclude_directories=1, allow_empty=True)
Glob, belirli yol kalıplarıyla eşleşen tüm dosyaları bulan ve bunların yollarının yeni, değişebilir 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.
Dosyanın pakete bağlı yolu, include
kalıplarından herhangi biriyle eşleşir ancak exclude
kalıplarından hiçbiriyle eşleşirse kaynak dosyanın Etiketi sonuca dahil edilir.
include
ve exclude
listeleri, mevcut paketle göreli olan yol kalıpları içerir. Her kalıp, bir veya daha fazla yol segmentinden oluşabilir. Unix yollarında olduğu gibi bu segmentler /
ile ayrılır. Kalıptaki segmentler, yolun segmentleriyle eşleştirilir. Segmentler, *
joker karakterini içerebilir. Bu, dizin ayırıcısı /
hariç olmak üzere yol segmentindeki herhangi bir alt dizeyle (boş alt dize dahil) eşleşir. Bu joker karakter, bir yol segmentinde birden fazla kez kullanılabilir. Buna ek olarak, **
joker karakteri sıfır veya daha fazla tam yol segmentiyle eşleşebilir ancak bağımsız bir yol segmenti olarak açıklanmalıdır.
foo/bar.txt
, bu pakettekifoo/bar.txt
dosyasıyla tam olarak eşleşir (foo/
bir alt paket değilse)- Dosya
.txt
ile bitiyorsafoo/*.txt
,foo/
dizinindeki her dosyayla eşleşir (foo/
bir alt paket değilse) foo/a*.htm*
,foo/
dizinindekia
ile başlayan, rastgele bir dizeye sahip (boş olabilir), ardından.htm
içeren ve başka bir rastgele dizeyle biten (foo/
alt paket olmadığı sürece) tüm dosyalarla eşleşir (ör.foo/axx.htm
vefoo/a.html
veyafoo/axxx.html
).foo/*
,foo/
dizinindeki her dosyayla eşleşir (foo/
bir alt paket değilse);exclude_directories
değeri 0 olarak ayarlanmış olsa bilefoo
dizininin kendisiyle eşleşmez.foo/**
, paketin birinci düzey alt dizini olanfoo/
altında, alt paket olmayan her alt dizindeki her dosyayla eşleşir.exclude_directories
0 olarak ayarlanırsafoo
dizininin kendisi de kalıpla eşleşir. Bu durumda,**
dizininin sıfır yol segmentleriyle eşleştiği kabul edilir**/a.txt
, bu paketin dizinindekia.txt
dosya ve alt paket olmayan alt dizinler ile eşleşir.**/bar/**/*.txt
, bu paketin alt paket olmayan her bir alt dizinindeki her.txt
dosyasıyla eşleşir. Sonuçta ortaya çıkan yoldaki en az bir dizinbar
olarak adlandırılırsa (örneğin,xxx/bar/yyy/zzz/a.txt
veyabar/a.txt
) (**
ifadesinin de sıfır segmentle eşleştiğini unutmayın) veyabar/zzz/a.txt
**
, bu paketin alt paket olmayan her alt dizinindeki her dosyayla eşleşirfoo**/a.txt
geçersiz bir kalıp, çünkü**
bağımsız bir segment olarak durmalıdır/
sonrasında tanımlanan ikinci segment boş bir dize olduğu içinfoo/
geçersiz bir kalıptır
exclude_directories
bağımsız değişkeni etkinleştirilirse (1 olarak ayarlanır) tür dizini dosyaları sonuçlardan çıkarılır (varsayılan 1).
allow_empty
bağımsız değişkeni False
olarak ayarlanırsa sonuç boş liste olursa glob
işlevi hata verir.
Bu konuda bazı önemli sınırlamalar ve uyarılar vardır:
-
glob()
, DERLEME dosyası değerlendirmesi sırasında çalıştığındanglob()
yalnızca kaynak ağacınızdaki dosyaları eşleştirir, hiçbir zaman oluşturulmamış dosyalarla eşleşir. Hem kaynak hem de oluşturulmuş dosyalar gerektiren bir hedef oluşturuyorsanız oluşturulan dosyaların açık 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 dosya ile aynı ada sahipse dosyayı "gölgelendirir".
Bunu anlamak için
glob()
yönteminin bir yollar listesi döndürdüğünü unutmayın.Bu nedenle, diğer kuralların özelliğinde (ör.srcs = glob(["*.cc"])
)glob()
işlevinin kullanılması, eşleşen yolların açıkça listelenmesiyle aynı etkiye sahiptir. Örneğin,glob()
değeri["Foo.java", "bar/Baz.java"]
sonucunu verir ancak pakette "Foo.java" adında bir kural da varsa (Bazel bu konuda uyarsa da buna izin verilir)glob()
tüketicisi, "Foo.java" dosyası yerine "Foo.java" kuralını (çıkışları) kullanır. Daha fazla bilgi için GitHub sorunu #10395'e göz atın. - Glob'lar, alt dizinlerdeki dosyaları eşleştirebilir. Alt dizin adlarına da joker karakter eklenebilir. Ancak...
-
Etiketlerin paket sınırını geçmesine izin verilmez ve glob alt paketlerdeki dosyalarla eşleşmez.
Örneğin,
x/y
paket olarak (x/y/BUILD
olarak veya paket yolu üzerinde başka bir yerde) mevcutsax
paketindeki**/*.cc
glob ifadesix/y/z.cc
içermez. Bu, glob ifadesinin sonucunun aslında DERLEME dosyalarının varlığına bağlı olduğu anlamına gelir. Yanix/y
adında bir paket yoksa veya --deleted_packages işareti kullanılarak silindi olarak işaretlenmişse aynı glob ifadesix/y/z.cc
ifadesini içerir. - Yukarıdaki kısıtlama, kullandıkları joker karakterlerden bağımsız olarak tüm glob ifadeleri için geçerlidir.
-
Dosya adı
.
ile başlayan bir gizli dosya hem**
hem de*
joker karakterleri ile tam olarak eşleşir. Gizli bir dosyayı bileşik kalıpla eşleştirmek istiyorsanız kalıbınızın.
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 kullanılması gerekmeyen dosyalar içerebilir ve gereksiz yere glob'a neden olan dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için bunları "hariç tutma" listesi bağımsız değişkenine ekleyin. -
"**" joker karakterinin yalnızca bir köşesi vardır:
"**"
kalıbı, paketin dizin yoluyla eşleşmiyor. Diğer bir deyişle,glob(["**"], exclude_directories = 0)
mevcut paketin dizinindeki tüm dosya ve dizinleri geçişli olarak eşleştirir (ancak alt paket dizinlerine inmez; bununla ilgili bir önceki nota bakın).
Genel olarak, glob kalıp için yalnızca '*' kullanmak yerine uygun bir uzantı (ör. *.html) sağlamayı denemeniz gerekir. Daha belirgin olan ad, hem kendini belgelendirir hem de yedek dosyaları veya emacs/vi/... otomatik kaydedilen dosyaları 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. Aşağıdaki genişletilmiş glob örneği bölümüne bakın.
Yerküre Örnekleri
Bu dizindeki tüm Java dosyalarından ve :gen_java_srcs
kuralıyla oluşturulan tüm dosyalardan oluşturulan 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ç tüm txt dosyalarını dizin test verilerine dahil edin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız yinelemeli 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 tüm txt dosyalarına ve alt dizinlerinden herhangi birine (ve bunların alt dizinlerine vb.) bağlı olmasını sağlayın. DERLEME 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 yolunda test adlı bir dizin bulunanlar hariç tüm alt dizinlerden oluşturulan bir kitaplık oluşturun. Derleme artımlılığını azaltıp derleme sürelerini artırabileceği için bu düzenden mümkünse kaçınılmalıdır.
java_library( name = "mylib", srcs = glob( ["**/*.java"], exclude = ["**/testing/**"], ), )
Genişletilmiş Yerküre Örnekleri
Geçerli dizinde, dosyadaki satır sayısını sayan bağımsız bir *_test.cc parametresi 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 DERLEME dosyası //foo paketindeyse ve paket üç eşleşen dosya içeriyorsa (a_test.cc, b_test.cc ve c_test.cc) bazel query '//foo:all'
öğesini çalıştırmak, 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()
, bir kural özelliğini yapılandırılabilir hale getiren yardımcı işlevdir.
Herhangi bir özellik atamasının neredeyse sağ tarafıyla değiştirilerek değeri, komut satırı Bazel işaretlerine bağlıdır.
Örneğin bunu, platforma özel bağımlılıkları tanımlamak veya bir kuralın "geliştirici" ve "sürüm" modunda mı oluşturulduğuna bağlı olarak farklı kaynaklar yerleştirmek için 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, bir sh_binary
öğesinin srcs
özelliğini, yapılandırma koşullarını eşleşen değerlerle eşleyen bir select
çağrısıyla normal etiket listesi atamasını değiştirerek yapılandırılabilir hale getirir. Her koşul, config_setting
veya constraint_value
için bir etiket referansıdır ve hedefin yapılandırması beklenen bir değer grubuyla eşleşirse bu durum "eşleşir". Ardından mytarget#srcs
değeri, mevcut çağrıyla eşleşen etiket listesi olur.
Notlar:
- Herhangi bir çağrıda tam olarak bir koşul seçilir.
- Birden çok koşul eşleşiyorsa ve biri diğerlerinin uzmanlığıysa uzmanlık öncelikli olur. B koşulu, A ile tamamen aynı işaret ve kısıtlama değerlerine ve bazı ek işaretlere veya kısıtlama değerlerine sahipse B koşulu, A koşulunun uzmanlığı olarak kabul edilir. Bu, uzmanlık çözümünün aşağıdaki 2. Örnek'te gösterildiği gibi bir sıralama oluşturmak için tasarlanmadığı anlamına da gelir.
- Birden çok koşul eşleşirse ve bir koşul diğer tüm koşulların uzmanlığı değilse Bazel, tüm koşullar aynı değere çözülmediği sürece bir hatayla başarısız olur.
- Eşleşen başka bir koşul yoksa
//conditions:default
özel sözde etiket ile eşleşiyor olarak kabul edilir. Bu koşul dışarıda bırakılırsa hatadan kaçınmak için diğer kuralların eşleşmesi gerekir. select
, daha büyük bir özellik atamasının içine yerleştirilebilir. Dolayısıyla,srcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})
vesrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})
geçerli ifadelerdir.select
, hepsiyle 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()
işlevine benzer şekilde 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 herhangi bir alt paketle eşleşebilir. Ayrıntılı açıklama ve dahil etme ve hariç tutma kalıplarına ilişkin örnekler için glob'a bakın.Döndürülen alt paketlerin sonuç listesi, sıralı düzendedir ve
exclude
içindekilerle değil,include
içindeki belirtilen kalıplarla eşleşen geçerli yükleme paketine göre yollar içerir.Örnek
Aşağıdaki örnekte
foo/BUILD
paketi için tüm doğrudan alt paketler listelenmektedir# The following BUILD files exist: # foo/BUILD # foo/bar/baz/BUILD # foo/bar/but/bad/BUILD # foo/sub/BUILD # foo/sub/deeper/BUILD # # In foo/BUILD a call to subs1 = subpackages(include = ["**"]) # results in subs1 == ["sub", "bar/baz", "bar/but/bad"] # # 'sub/deeper' is not included because it is a subpackage of 'foo/sub' not of # 'foo' subs2 = subpackages(include = ["bar/*"]) # results in subs2 = ["bar/baz"] # # Since 'bar' is not a subpackage itself, this looks for any subpackages under # all first level subdirectories of 'bar'. subs3 = subpackages(include = ["bar/**"]) # results in subs3 = ["bar/baz", "bar/but/bad"] # # Since bar is not a subpackage itself, this looks for any subpackages which are # (1) under all subdirectories of 'bar' which can be at any level, (2) not a # subpackage of another subpackages. subs4 = subpackages(include = ["sub"]) subs5 = subpackages(include = ["sub/*"]) subs6 = subpackages(include = ["sub/**"]) # results in subs4 and subs6 being ["sub"] # results in subs5 = []. # # In subs4, expression "sub" checks whether 'foo/sub' is a package (i.e. is a # subpackage of 'foo'). # In subs5, "sub/*" looks for subpackages under directory 'foo/sub'. Since # 'foo/sub' is already a subpackage itself, the subdirectories will not be # traversed anymore. # In subs6, 'foo/sub' is a subpackage itself and matches pattern "sub/**", so it # is returned. But the subdirectories of 'foo/sub' will not be traversed # anymore.
Genel olarak, kullanıcıların bu işlevi doğrudan çağırmak yerine skylib'in "alt paketler" modülünü kullanması tercih edilir.