Etiket, bir hedefin tanımlayıcısıdır. Tam standart biçiminde tipik bir etiket şöyle görünür:
@@myrepo//my/app/main:app_binary
Etiketin ilk bölümü kod deposu adıdır: @@myrepo
. Çift @
söz dizimi, bunun çalışma alanı içinde benzersiz bir standart depo adı olduğunu belirtir. Standart depo adlarına sahip etiketler, hangi bağlamda göründüklerinden bağımsız olarak bir hedefi açık bir şekilde tanımlar.
Genellikle standart depo adı, @@rules_java~7.1.0~toolchains~local_jdk
gibi görünen gizli bir dizedir. Çok daha yaygın görülen, görünür kod deposu adına sahip etiketlerdir. Bu kod aşağıdaki gibi görünür:
@myrepo//my/app/main:app_binary
Tek fark, depo adının önüne iki yerine bir @
eklenmesidir.
Bu, myrepo
görünen adı olan bir depoya işaret eder. Bu ad, bu etiketin göründüğü bağlama göre farklı olabilir.
Bir etiketin kullanıldığı depoya işaret etmesi durumunda depo adı bölümü atlanabilir. Dolayısıyla, @@myrepo
içinde ilk etiket genellikle
//my/app/main:app_binary
Etiketin ikinci bölümü, uygun olmayan paket adı my/app/main
, yani depo köküne göre paketin yoludur. Depo adı ve uygun olmayan paket adı birlikte tam nitelikli paket adını @@myrepo//my/app/main
oluşturur. Etiket, kullanıldığı pakete atıfta bulunduğunda paket adı (ve isteğe bağlı olarak iki nokta işareti) atlanabilir. Dolayısıyla, bu etiket @@myrepo//my/app/main
içine aşağıdaki yollardan biriyle yazılabilir:
app_binary
:app_binary
İki nokta üst üste işareti, dosyalar için atlanır ancak kurallar için tutulur ancak başka bir önemi yoktur.
Etiketin iki nokta üst üste işaretinden sonraki bölümü olan app_binary
, uygun olmayan hedef adıdır. Paket yolunun son bileşeniyle eşleştiğinde, kendisi ve iki nokta üst üste çıkarılabilir. Bu nedenle, bu iki etiket eşdeğerdir:
//my/app/lib
//my/app/lib:lib
Paketin alt dizinindeki bir dosya hedefinin adı, dosyanın paket kök dizinine (BUILD
dosyasını içeren dizin) göreli yoludur. Bu dosya, deponun my/app/main/testdata
alt dizininde yer almaktadır:
//my/app/main:testdata/input.txt
//my/app
ve @@some_repo//my/app
gibi dizeler, kullanıldıkları bağlama bağlı olarak iki anlama gelir: Bazel bir etiket beklediğinde sırasıyla //my/app:app
ve @@some_repo//my/app:app
anlamına gelir. Ancak, Bazel bir paket beklediğinde (ör. package_group
spesifikasyonlarında) bu etiketi içeren pakete referans verir.
BUILD
dosyalarında yaygın olarak yapılan bir hata, bir pakete referans vermek için //my/app
kullanılmasıdır ya da bir paketteki tüm hedeflere başvuruda bulunmaktır, ancak bunu yapmaz. //my/app:app
ile eşdeğer olduğunu unutmayın. Bu nedenle, app
hedefini mevcut deponun my/app
paketinde belirtir.
Bununla birlikte, paket adının mutlak olduğunu ve çalışma alanının üst düzey dizininde rootlanmış olduğunu açıkça belirttiğinden, bir pakete başvuruda bulunmak için //my/app
kullanılması, package_group
spesifikasyonunda veya .bzl
dosyalarında önerilir.
Göreli etiketler diğer paketlerdeki hedeflere başvuruda bulunmak için kullanılamaz. Bu durumda depo tanımlayıcısı ve paket adı her zaman belirtilmelidir.
Örneğin, kaynak ağaç hem my/app
paketini hem de my/app/testdata
paketini içeriyorsa (bu iki dizinin her birinin kendine ait BUILD
dosyası vardır) ikinci paket testdepot.zip
adlı bir dosya içerir. //my/app:BUILD
içinde bu dosyaya başvuruda bulunmanın iki yolu (biri yanlış, biri doğru):
Yanlış — testdata
farklı bir paket olduğundan göreli bir yol kullanamazsınız
testdata/testdepot.zip
Doğru: Tam yolu ile testdata
referans gösterilsin
//my/app/testdata:testdepot.zip
@@//
ile başlayan etiketler, ana kod deposuna yapılan referanslardır ve bu etiketler, harici kod depolarında bile çalışmaya devam eder.
Bu nedenle @@//a/b/c
, harici bir depodan referans alındığında //a/b/c
ile farklıdır.
Birincisi ana kod deposunu, ikincisi ise harici deponun kendisinde //a/b/c
arar.
Bu, özellikle ana depodaki hedeflere atıfta bulunan kurallar yazarken geçerlidir ve harici depolardan kullanılır.
Hedeflere başvuruda bulunabileceğiniz farklı yollar hakkında bilgi edinmek için hedef kalıpları konusuna bakın.
Etiketin sözcüksel spesifikasyonu
Etiket söz dizimi, kabuk için özel anlamı olan meta karakterlerin kullanılmasını önler. Bu, yanlışlıkla alıntı sorunlarından kaçınmaya yardımcı olur ve Bazel Sorgu Dili gibi etiketleri işleyen araçlar ve komut dosyaları oluşturmayı kolaylaştırır.
İzin verilen hedef adlarıyla ilgili kesin ayrıntıları aşağıda bulabilirsiniz.
Hedef adları — package-name:target-name
target-name
, paket içindeki hedefin adıdır. Bir kuralın adı, BUILD
dosyasındaki kuralın bildirimindeki name
özelliğinin değeridir. Dosya adı ise BUILD
dosyasını içeren dizine göreli yol adıdır.
Hedef adları tamamen a
–z
,
A
–Z
, 0
–9
kümelerinden alınan karakterler ile !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
noktalama işaretlerinden oluşmalıdır.
Dosya adları, normal biçimde göreli yol adları olmalıdır. Diğer bir deyişle, ne eğik çizgiyle başlamalı ne de bitmemeli (örneğin, /foo
ve foo/
yasaktır) ve yol ayırıcı olarak birden fazla eğik çizgi (ör. foo//bar
) içermemelidir. Benzer şekilde, üst düzey referanslar (..
) ve geçerli dizin referansları (./
) da yasaktır.
Yanlış: Diğer paketlerdeki dosyalara referans vermek için ..
kullanmayın
Doğru — //package-name:filename
kullanın
Dosya hedefi adında /
kullanımı yaygın olsa da kural adlarında /
kullanımından kaçının. Özellikle de bir etiketin kısaltma biçimi kullanıldığında
okuyucunun kafası karışabilir. //foo/bar/wiz
etiketi, foo/bar/wiz
paketi olmasa bile her zaman //foo/bar/wiz:wiz
ifadesinin kısaltmasıdır; bu hedef mevcut olsa bile hiçbir zaman //foo:bar/wiz
anlamına gelmez.
Bununla birlikte, eğik çizgi kullanmanın uygun veya bazen gerekli olduğu bazı durumlar da vardır. Örneğin, belirli kuralların adı, paketin bir alt dizininde bulunabilen ana kaynak dosyasıyla eşleşmelidir.
Paket adları — //package-name:target-name
Paket adı, paketin bulunduğu deponun en üst düzey dizinine göreli olarak, paketin BUILD
dosyasını içeren dizinin adıdır.
Örneğin: my/app
.
Teknik düzeyde, Bazel şunları uygular:
- Paket adlarında, küçük harflerden
a
-z
arası büyük harfler,A
-Z
arasındaki büyük harfler,0
-9
arasındaki rakamlar,! \"#$%&'()*+,-.;<=>?@[]^_`{|}
karakterleri (evet, boşluk karakteri vardır) ve elbette öne eğik çizgi (dizin ayırıcı olduğu için)/
karakterleri kullanılabilir. - Paket adları eğik çizgi karakteriyle (
/
) başlayamaz veya bitemez. - Paket adları
//
alt dizesini içeremez. Mantıklı olmazdı, çünkü karşılık gelen dizin yolu ne olurdu? - Paket adları
/./
,/../
veya/.../
alt dizesini içeremez. Bu yaptırım, yol dizelerindeki nokta karakterinin anlamsal anlamı göz önünde bulundurularak, mantıksal paket adı ile fiziksel dizin adı arasında çeviri yaparken karışıklık olmasını önlemek için yapılır.
Pratik bir düzeyde:
- Modül sistemi için önemli bir dizin yapısına sahip bir dil (ör. Java) söz konusu dilde geçerli tanımlayıcılar olan dizin adlarını seçmek önemlidir. Örneğin, baştaki bir rakamla başlamayın ve özel karakterler (özellikle alt çizgi ve kısa çizgi) kullanmaktan kaçının.
- Bazel, çalışma alanının kök paketindeki hedefleri (örneğin,
//:foo
) desteklese de tüm anlamlı paketlerin açıklayıcı adları olması için bu paketi boş bırakmak en iyisidir.
Kurallar
Kural, girdiler ile çıkışlar arasındaki ilişkiyi ve çıktıları oluşturma adımlarını belirtir. Kurallar, birçok farklı türden (bazen kural sınıfı olarak da adlandırılır) olabilir. Bu işlem, derlenmiş yürütülebilir dosyalar ve kitaplıklar üretir, yürütülebilir dosyaları ve Ansiklopedi Oluşturma bölümünde açıklandığı gibi desteklenen diğer çıkışları test eder.
BUILD
dosyaları, kuralları çağırarak hedefler bildirir.
Aşağıdaki örnekte, cc_binary
kuralı kullanılarak my_app
hedefinin bildirildiğini görüyoruz.
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
Her kural çağrısının, BUILD
dosyasının paketi içinde bir hedef tanımlayan bir name
özelliği (geçerli bir hedef ad olmalıdır) vardır.
Her kuralın bir özellikleri grubu vardır. Belirli bir kural için geçerli özellikler ve her özelliğin önem ve semantiği, kural türünün bir işlevidir. Kurallar ve ilgili özellikleri için Ansiklopedi Oluşturma bölümüne bakın. Her özelliğin bir adı ve türü vardır. Bir özelliğin sahip olabileceği yaygın türlerden bazıları tamsayı, etiket, etiket listesi, dize, dize listesi, çıktı etiketi ve çıkış etiketleri listesidir. Özelliklerin her kuralda belirtilmesi gerekmez. Böylece özellikler, anahtarlardan (adlardan) isteğe bağlı yazılan değerlere kadar bir sözlük oluşturur.
Birçok kuralda bulunan srcs
özelliği, "etiket listesi" türüne sahiptir. Bu özelliğin değeri (varsa), her biri bu kuralın girdisi olan bir hedefin adı olacak şekilde bir etiket listesidir.
Bazı durumlarda, kural türünün adı biraz rastgele verilebilir ve kural tarafından oluşturulan dosyaların adları daha ilgi çekicidir. Bu adlar için de geçerlidir. Daha fazla bilgi için Genel Kurallar: genrule bölümüne bakın.
Diğer durumlarda da ad önem taşır. Örneğin, *_binary
ve *_test
kuralları için kural adı, derleme tarafından oluşturulan yürütülebilir dosyanın adını belirler.
Hedefler üzerindeki bu döngüsel grafiğe hedef grafik veya bağımlılık grafiği oluşturma denir ve Bazel Sorgu aracının üzerinde çalıştığı alandır.
Hedefler | BUILD dosyaları |