İçindekiler
paket
package(default_deprecation, default_testonly, default_visibility, features)
Bu işlev, pakette bulunan sonraki her kural için geçerli olan meta verileri tanımlar. Paket içinde en fazla bir kez kullanılır (DERLEME dosyası).
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_visibility |
Bu paketteki kuralların varsayılan görünürlüğü. Kuralın |
default_deprecation |
Bu paketteki tüm kurallar için varsayılan
|
default_testonly |
Bu paketteki tüm kurallar için varsayılan
|
features |
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 sistemi üzerinde çalışan kişiler tarafından kullanılır. Derleme sistemi üzerinde çalışan biri tarafından açıkça talep edilmediğ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 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 grubunu tanımlar ve bir etiketi grupla ilişkilendirir. Etikete visibility
özelliklerinde referans verilebilir.
Paket grupları temel olarak görünürlük denetimi için kullanılır. Kaynak ağaçtaki her paketten herkese açık bir hedefe referans verilebilir. Özel olarak görünür bir hedefe yalnızca kendi paketi içinde referans verilebilir (alt paketler değil). Bu uç noktalar arasında, bir hedef kendi paketine ve bir veya daha fazla paket grubu tarafından tanımlanan paketlere 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 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ına sahip değildir.
Bağımsız değişkenler
Özellik | Açıklama |
---|---|
name |
Bu hedef için benzersiz bir ad. |
packages |
Sıfır veya daha fazla paket özelliğinden oluşan liste. Her paket spesifikasyonu dizesi, aşağıdaki biçimlerden birine sahip olabilir:
Ayrıca, ilk iki paket özelliği türünün ters bırakıldığını belirtmek için bunlara Paket grubu, pozitif özelliklerinden en az biriyle eşleşen ancak negatif özelliklerinden hiçbiriyle eşleşen herhangi bir paket içeriyor. Ö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 ayarlamak, yalnızca Not: Bazel 6.0'dan önce Not: Bazel 6.0'dan önce, bu özellik |
includes |
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 kabul edilir. Bu geçişlidir. 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 toplandığını unutmayın. Bu da bir gruptaki reddedilen spesifikasyonların diğer gruptaki spesifikasyonlar üzerinde herhangi bir etkisi olmadığı anlamına gelir. |
Örnekler
Aşağıdaki package_group
beyanı, 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 DERLEME dosyası, yalnızca exports_files()
ifadesiyle açıkça dışa aktarılan başka bir pakete ait kaynak dosyalarına doğrudan referans verebilir. Dosyaların görünürlüğü hakkında daha fazla bilgi edinin.
Eski bir davranış olarak, bir kurala girdi olarak bahsedilen dosyalar da bayrak --incompatible_no_implicit_file_export
çevrilene kadar varsayılan görünürlükle dışa aktarılır. Ancak bu davranış temel alınmaması ve etkin bir şekilde taşınmaması gerekir.
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 beyanı da belirtilebilir. Bu durumda, dosyalar belirtilen hedefler tarafından görülebilir. Görünürlük belirtilmezse package
işlevinde paket 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ılı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 bunların yollarının yeni, değişebilir, sıralanmış listesini döndüren yardımcı bir işlevdir. Glob, dosyalarda yalnızca kendi paketinde arama yapar ve sadece kaynak dosyaları arar (oluşturulan dosyaları veya diğer hedefleri değil).
Dosyanın pakete göre yolu, include
kalıplarından herhangi biriyle eşleşirse ve exclude
kalıplarından hiçbiriyle eşleşirse kaynak dosyanın Etiketi sonuca dahil edilir.
include
ve exclude
listeleri, mevcut paketle göreli yol kalıpları içerir. Her kalıp, bir veya daha fazla yol
segmentinden oluşabilir. Unix yollarında her zamanki gibi bu segmentler /
ile ayrılır. Segmentler, *
joker karakterini içerebilir. Bu, dizin ayırıcısı /
hariç olmak üzere yol segmentindeki (boş alt dize dahil) herhangi bir alt dizeyle 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/
dizinindekia
ile başlayan, rastgele bir dizeye (boş olabilir) sahip, ardından.htm
içeren ve isteğe bağlı başka bir dizeyle biten her dosyayla eşleşir (ör.foo/axx.htm
vefoo/a.html
veyafoo/axxx.html
)**/a.txt
, bu paketin her alt dizinindeki hera.txt
dosyasıyla eşleşir**/bar/**/*.txt
, bu paketin her alt dizinindeki her bir.txt
dosyasıyla eşleşir. Sonuçta ortaya çıkan dizinlerden en az biribar
olarak adlandırılırsa (ör.xxx/bar/yyy/zzz/a.txt
veyabar/a.txt
) (**
öğesinin sıfır segmentle eşleştiğini unutmayın) veyabar/zzz/a.txt
**
, bu paketin her alt dizinindeki her dosyayla eşleşirfoo**/a.txt
, geçersiz bir kalıp çünkü**
, tek başına bir segment olarak durmalıdır
exclude_directories
bağımsız değişkeni etkinleştirilirse (1 olarak ayarlanır) 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 olursa glob
işlevi hata verir.
Birkaç önemli sınırlama ve uyarı söz konusudur:
-
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ış dosyaları eşleştirir. 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 birlikte aşağıdaki örneğe bakın. -
Bir kural, eşleşen bir kaynak dosyayla aynı ada sahipse dosyayı "gölgelendirir".
Bunu anlamak için
glob()
işlevinin bir yol listesi döndürdüğünü unutmayın.Dolayısıyla, diğer kuralların özelliğinde (ör.srcs = glob(["*.cc"])
)glob()
kullanmak, eşleşen yolların açıkça listelenmesi ile aynı etkiye sahiptir. Örneğinglob()
,["Foo.java", "bar/Baz.java"]
sonucunu verir ancak pakette "Foo.java" adında bir kural da varsa (Bazel tarafından uyarılsa da buna izin verilir)glob()
tüketicisi "Foo.java" dosyası yerine "Foo.java" kuralını (çıktılarını) kullanır. Daha fazla bilgi için GitHub #10395 sorunu bölümüne bakın. - Glob'lar, alt dizinlerdeki dosyaları eşleştirebilir. Alt dizin adlarına da joker karakter 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 yolunda başka bir yerdeyse)x
paketindeki**/*.cc
glob ifadesix/y/z.cc
içermez. Diğer bir deyişle, glob ifadesi sonucunda elde edilen sonuç, aslında DERLEME dosyalarının varlığına bağlıdır. Yani,x/y
adında bir paket yoksa veya --deleted_packages işareti kullanılarak silindi olarak işaretlendiyse aynı glob ifadesi,x/y/z.cc
ifadesini de 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 karakterlerle 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 gerekli olmayan dosyalar içerebilir ve gereksiz yere küresel dosyaların sayısını ve bellek tüketimini artırabilir. Gizli dizinleri hariç tutmak için "hariç tut" 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 elbette alt paketlerin dizinlerine girmez; bu konuyla ilgili bir önceki notu inceleyin).
Genel olarak, glob kalıp için sadece "*" kullanmak yerine uygun bir uzantı (ör. *.html) sağlamayı denemeniz gerekir. Daha açık olan ad, hem kendini belgeleme hem de yedek dosyaları veya emacs/vi/... otomatik kaydedilen dosyaları yanlışlıkla eşleştirmemenizi sağlar.
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ş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", ], ... )
Experiment.txt dışındaki tüm txt dosyalarını dizin test verilerine ekleyin. Test verilerinin alt dizinlerindeki dosyaların dahil edilmediğini unutmayın. Bu dosyaların eklenmesini 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
Testi, testverileri dizinindeki ve bu dizinin tüm alt dizinlerindeki (ve bunların alt dizinleri vb.) tüm txt dosyalarına bağlı hale getirin. DERLEME dosyası içeren alt dizinler yok sayı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 tüm Java dosyalarından ve 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 artırabileceğ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ş Yerküre Örnekleri
Geçerli dizinde, dosyadaki satır sayısını sayan tek bir *_test.cc öğesi için tek bir tür 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'
ç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çer
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ın sağ tarafını değiştirebilir, böylece değeri komut satırındaki 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 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, bir sh_binary
öğesinin 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 sh_binary
öğesinin srcs
özelliğini yapılandırılabilir hale getirir. Her koşul, config_setting
veya constraint_value
için bir etiket referansıdır. Hedefin yapılandırması beklenen bir değer grubuyla eşleşirse "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 fazla koşul eşleşirse ve biri diğerlerinin uzmanlığıysa uzmanlık öncelikli olur. B koşulu, A ile 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 fazla koşul eşleşir ve bir koşul diğer tüm koşulların uzmanlığı değilse Bazel tüm koşullar aynı değere çözümlenmediği sürece hata verir.
- Başka koşul eşleşmediğinde
//conditions:default
özel sözde etiket eşleşmiş olarak kabul edilir. Bu koşul dışarıda bırakılırsa hatadan kaçınmak 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ş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 ş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 ile 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çindekiler 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/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 "alt paketler" modülünü kullanmaları tercih edilir.