İç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.
Deponun tamamındaki her kural için geçerli olan meta verileri bildiren karşılığı için deponuzun kökündeki REPO.bazel dosyasında repo() işlevini kullanın.
repo() işlevi, package() ile tamamen aynı bağımsız değişkenleri alır.
package() işlevi, dosyanın en üstündeki 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, 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 varsayılan bir meta veri hedefi listesi ayarlar. Bunlar genellikle OSS paketi ve lisans beyanlarıyla ilgili hedeflerdir. Örnekler için rules_license sayfasına bakın. |
default_testonly |
Boole; aksi belirtilmedikçe varsayılan değer Bu paketteki tüm kurallar için varsayılan
|
features |
Dizeleri listele; varsayılan değer: Bu BUILD dosyasının semantiğini etkileyen çeşitli işaretler ayarlar. Bu özellik, esas olarak derleme sistemi üzerinde çalışan kişiler tarafından özel işlem gerektiren paketleri etiketlemek için 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 üyeleri tarafından görülebileceğini belirtir. Bir kuralda bireysel görünürlük beyanları 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 bu grupla bir etiket ilişkilendirir. Etikete visibility özelliklerinde referans verilebilir.
Paket grupları öncelikle görünürlük kontrolü için kullanılır. Herkese açık bir hedefe, kaynak ağacındaki her paketten referans verilebilir. Özel olarak görünür bir hedefe yalnızca kendi paketi içinde (alt paketler değil) referans verilebilir. 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 sistemi hakkında daha ayrıntılı bilgi 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 görünürlük koruması yoktur.
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 spesifikasyonunun listesi. Her paket spesifikasyon dizesi aşağıdaki biçimlerden birine sahip olabilir:
Ayrıca, ilk iki paket spesifikasyonu türü, geçersiz kılındıklarını belirtmek için Paket grubu, pozitif spesifikasyonlarından en az biriyle eşleşen ve negatif spesifikasyonlarından hiçbiriyle eşleşmeyen tüm paketleri içerir. Örneğin, Herkese açık görünürlük dışında, mevcut depo dışındaki paketleri doğrudan belirtmenin bir yolu yoktur. Bu özellik eksikse boş bir listeye ayarlanmış gibi olur. Bu da yalnızca Not: Bazel 6.0'dan önce Not: Bazel 6.0'dan önce, bu özellik |
includes |
Etiket listesi; varsayılan değer: Bu pakete dahil olan diğer paket grupları. Bu özellikteki etiketler diğer paket gruplarına referans vermelidir.
Referans verilen paket gruplarındaki paketler bu paket grubunun bir parçası olarak kabul edilir. Bu geçişlidir. Olumsuz paket spesifikasyonlarıyla 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 olumsuzlanmış spesifikasyonların başka bir gruptaki spesifikasyonlar üzerinde hiçbir etkisi olmadığı anlamına gelir. |
Örnekler
Aşağıdaki package_group beyanı, tropikal meyveler içeren "tropikal" 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 exports_files() ifadesiyle açıkça dışa aktarılan başka bir pakete ait kaynak dosyalara doğrudan başvurabilir. Dosyaların görünürlüğü hakkında daha fazla bilgi edinin.
Eski bir davranış olarak, bir kuralın girişi olarak belirtilen dosyalar da --incompatible_no_implicit_file_export işareti değiştirilene kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranışa güvenilmemeli ve etkin bir şekilde başka bir yönteme geçilmelidir.
Bağımsız değişkenler
Bağımsız değişken, mevcut paketteki dosyaların adlarının 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 dosyalar, package işlevinde varsayılan bir paket 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ıyor. Böylece diğer paketler bu dosyayı, örneğin 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 yardımcı bir işlevdir. Glob yalnızca kendi paketindeki dosyaları arar ve yalnızca kaynak dosyaları arar (oluşturulan dosyaları veya diğer hedefleri değil).
Dosyanın pakete göreli yolu include kalıplarından herhangi biriyle eşleşiyor ve exclude kalıplarından hiçbiriyle eşleşmiyorsa kaynak dosyanın etiketi sonuca dahil edilir.
include ve exclude listeleri, mevcut paketle ilgili 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. Segmentler * joker karakterini içerebilir: Bu karakter, dizin ayırıcı / hariç olmak üzere yol segmentindeki tüm alt dizelerle (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 tanımlanmalıdır.
foo/bar.txt, bu pakettekifoo/bar.txtdosyasıyla tam olarak eşleşiyorfoo/*.txt, dosya.txtile bitiyorsafoo/dizinindeki her dosyayla eşleşir (foo/bir alt paket değilse).foo/a*.htm*,foo/dizinindeaile başlayan, ardından rastgele bir dize (boş olabilir) ve.htmgelen, başka bir rastgele dizeyle biten tüm dosyalarla eşleşir. Örneğin,foo/axx.htmvefoo/a.htmlveyafoo/axxx.html**/a.txt, bu paketin her alt dizinindeki hera.txtdosyasıyla eşleşir.**/bar/**/*.txt, sonuçta elde edilen yoldaki en az bir dizinin adıbarise bu paketin her alt dizinindeki her.txtdosyasıyla eşleşir (ör.xxx/bar/yyy/zzz/a.txtveyabar/a.txt(**ifadesinin sıfır segmentle de eşleştiğini unutmayın) ya dabar/zzz/a.txt)**, bu paketin her alt dizinindeki her dosyayla eşleşir.foo**/a.txtgeçersiz bir kalıp çünkü**tek başına bir segment olarak bulunmalıdır.
exclude_directories bağımsız değişkeni etkinleştirilirse (1 değerine ayarlanırsa) dizin türündeki dosyalar sonuçlardan çıkarılır (varsayılan değer 1'dir).
allow_empty bağımsız değişkeni False olarak ayarlanırsa sonuç boş liste olduğunda glob işlevi hata verir.
Birkaç önemli sınırlama ve uyarı vardır:
-
glob(), BUILD dosyası değerlendirmesi sırasında çalıştığındanglob()yalnızca kaynak ağacınızdaki dosyalarla eşleşir, oluşturulan dosyalarla hiçbir zaman eşleşmez. Hem kaynak hem de oluşturulan dosyaları gerektiren bir hedef oluşturuyorsanız glob'a oluşturulan dosyaların açık bir listesini eklemeniz gerekir.:mylibve:gen_java_srcsile ilgili aşağıdaki örneğe bakın. -
Bir kural, eşleşen bir kaynak dosyayla aynı ada sahipse kural, dosyayı "gölgeler".
Bunu anlamak için
glob()işlevinin bir yol listesi döndürdüğünü unutmayın.Bu nedenle, diğer kuralların özelliğinde (ör.srcs = glob(["*.cc"]))glob()kullanmak, eşleşen yolları açıkça listelemekle aynı etkiye sahiptir. Örneğin,glob(),["Foo.java", "bar/Baz.java"]sonucunu veriyorsa 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ını) kullanır. Daha fazla bilgi için GitHub sorunu #10395'e bakın. - Glob'lar, alt dizinlerdeki dosyalarla eşleşebilir. Alt dizin adlarında joker karakterler kullanılabilir. Ancak...
-
Etiketlerin paket sınırını aşmasına izin verilmez ve glob, alt paketlerdeki dosyalarla eşleşmez.
Örneğin,
xpaketindeki**/*.ccglob ifadesi,x/ybir paket olarak mevcutsa (x/y/BUILDolarak veya paket yolunda başka bir yerde)x/y/z.ccöğesini içermez. Bu, glob ifadesinin sonucunun aslında BUILD dosyalarının varlığına bağlı olduğu anlamına gelir. Yani,x/yadlı bir paket olmasaydı veya --deleted_packages işareti kullanılarak silinmiş olarak işaretlenseydi aynı glob ifadesix/y/z.ccöğesini içerirdi. - 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ı bileşik kalıpla eşleştirmek istiyorsanız kalıbınızın.ile başlaması gerekir. Örneğin,*ve.*.txt,.foo.txtile eşleşir ancak*.txteşleşmez. Gizli dizinler de aynı şekilde eşleştirilir. Gizli dizinler, giriş olarak gerekli olmayan dosyalar içerebilir ve gereksiz şekilde globbed dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için bunları "exclude" liste bağımsız değişkenine ekleyin. -
"**" joker karakterinin bir uç durumu vardır:
"**"kalıbı, paketin dizin yoluyla eşleşmez. Yaniglob(["**"], exclude_directories = 0), geçerli paketin dizininin altındaki tüm dosya ve dizinlerle geçişli olarak eşleşir (ancak alt paketlerin dizinlerine girmez. Bununla ilgili önceki nota bakın).
Genel olarak, glob kalıbı için yalın bir "*" kullanmak yerine uygun bir uzantı (ör. *.html) sağlamaya çalışmalısınız. Daha açık bir ad, hem kendi kendini belgeleyebilir hem de yedek dosyaları veya emacs/vi/... otomatik kaydetme dosyalarını yanlışlıkla eşleştirmemenizi sağlar.
Derleme kuralları yazarken glob öğ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.
Glob Örnekleri
Bu dizindeki tüm Java dosyalarından ve :gen_java_srcs kuralı tarafından oluşturulan tüm dosyalardan derlenen 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",
],
...
)
testdata dizinindeki experimental.txt hariç tüm txt dosyalarını dahil et. testdata'nın alt dizinlerindeki dosyaların dahil edilmeyeceğini unutmayın. Bu dosyaların dahil edilmesini istiyorsanız özyinelemeli glob (**) kullanın.
sh_test(
name = "mytest",
srcs = ["mytest.sh"],
data = glob(
["testdata/*.txt"],
exclude = ["testdata/experimental.txt"],
),
)
Yinelemeli Glob Örnekleri
Testi, testdata dizinindeki ve alt dizinlerindeki (ve bunların alt dizinlerindeki vb.) tüm txt dosyalarına bağlı hale getirin. 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 yolu "testing" adlı bir dizin içerenler hariç tüm alt dizinlerden oluşturulan bir kitaplık oluşturun. Derleme artımlılığını azaltabileceği ve dolayısıyla derleme sürelerini uzatabileceği için mümkünse bu kalıptan kaçınılmalıdır.
java_library(
name = "mylib",
srcs = glob(
["**/*.java"],
exclude = ["**/testing/**"],
),
)
Genişletilmiş Glob Örnekleri
Geçerli dizinde *_test.cc için dosyadaki satır sayısını hesaplayan 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 eşleşen üç dosya (a_test.cc, b_test.cc ve c_test.cc) varsa bazel query '//foo:all' komutunu çalıştırdığınızda 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(), bir kural özelliğini yapılandırılabilir hale getiren yardımcı işlevdir.
Neredeyse tüm özellik atamalarının sağ tarafını değiştirebilir. Böylece, değeri komut satırı Bazel işaretlerine bağlı olur.
Örneğin, platforma özgü bağımlılıkları tanımlamak veya bir kuralın "geliştirici" ya da "sürüm" modunda oluşturulup oluşturulmadığına 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, 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, hedefin yapılandırması beklenen bir değer kümesiyle eşleşirse "eşleşen" bir config_setting veya constraint_value için etiket referansıdır. mytarget#srcs değeri, mevcut çağrıyla eşleşen etiket listesi olur.
Notlar:
- Her çağrıda tam olarak bir koşul seçilir.
- Birden fazla koşul eşleşirse ve bunlardan biri diğerlerinin özelleştirmesiyse özelleştirme öncelikli olur. B koşulu, A ile aynı işaretlere ve kısıtlama değerlerine ek olarak bazı ek işaretlere veya kısıtlama değerlerine sahipse A koşulunun bir uzmanlığı olarak kabul edilir. Bu aynı zamanda, uzmanlık çözümünün aşağıdaki Örnek 2'de gösterildiği gibi bir sıralama oluşturmak için tasarlanmadığı anlamına da gelir.
- Birden fazla koşul eşleşirse ve bunlardan biri diğerlerinin tümünün özelleştirmesi değilse tüm koşullar aynı değere çözümlenmediği sürece Bazel hata verir.
- Başka bir koşul eşleşmezse özel sözde etiket
//conditions:defaulteşleşmiş kabul edilir. Bu koşulun atlanması durumunda, hata oluşmaması 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. Bu nedenlesrcs = ["common.sh"] + select({ ":conditionA": ["myrule_a.sh"], ...})vesrcs = select({ ":conditionA": ["a.sh"]}) + select({ ":conditionB": ["b.sh"]})geçerli ifadelerdir.select, tüm özelliklerle değil, çoğu özellik ile çalışır. Uyumsuz özellikler, belgelerindenonconfigurableile işaretlenir.alt paketler
subpackages(include, exclude=[], allow_empty=True)
subpackages(), dosya ve dizinler yerine alt paketleri listeleyenglob()işlevine benzer bir yardımcı işlevdir.glob()ile aynı yol kalıplarını kullanır ve o 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ının ayrıntılı açıklaması ve örnekleri için glob sayfasına bakın.Döndürülen alt paketlerin listesi sıralama ölçütüne göre sıralanmıştır ve
includeiçindeki kalıplarla eşleşen ancakexcludeiçindeki kalıplarla eşleşmeyen, mevcut yükleme paketiyle ilgili yolları içerir.Örnek
Aşağıdaki örnekte,
foo/BUILDpaketinin tüm doğrudan alt paketleri 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.