Etiket, bir hedefin tanımlayıcısıdır. Tam standart sayfasındaki tipik bir etiket aşağıdaki gibi görünür:
@@myrepo//my/app/main:app_binary
Etiketin ilk bölümü, @@myrepo
kod deposudur. Çift @
söz dizimi, bunun kurallı bir depo olduğunu belirtir
adı,
kontrol edebilirsiniz. Standart kod deposu adlarına sahip etiketler, bir hedefi açık bir şekilde tanımlar
kullanıcılarınızı ve ürünlerinizi.
Standart depo adı genellikle
@@rules_java++toolchains+local_jdk
Çok daha sık görülen
görünür kod deposu bulunan etiketler
Bu kod aşağıdaki gibi görünür:
@myrepo//my/app/main:app_binary
Tek fark, depo adının önünde iki yerine bir @
bulunmasıdır.
Bu kod, görünen adı myrepo
olan bir depoyu ifade eder. Bu kod farklı olabilir
bu etiketin göründüğü bağlama göre değişir.
Tipik bir durumda, bir etiket aynı depoya başvuruda bulunurken
kullanılırsa depo adı bölümü atlanabilir. Yani, @@myrepo
içinde ilk
etiketi genellikle
//my/app/main:app_binary
Etiketin ikinci bölümü, uygun olmayan paket adıdır
my/app/main
, paketin yolu
%100'e ulaştı. Depo adı ve bu kod deposunun
nitelikli olmayan paket adı, tam nitelikli paket adından oluşur
@@myrepo//my/app/main
Etiket, aynı terim
paketinin adı (ve isteğe bağlı olarak iki nokta üst üste)
atlanabilir. @@myrepo//my/app/main
içinde,
bu etiket aşağıdaki yollardan biri için yazılabilir:
app_binary
:app_binary
Genel olarak, iki nokta üst üste işareti dosyalarda çıkarılır. ancak kurallar için saklanır ancak başka şekilde önemli değildir.
Etiketin iki nokta üst üste işaretinden sonraki bölümü (app_binary
), uygun olmayan hedeftir
dokunun. Paket yolunun son bileşeniyle eşleştiğinde ve
iki nokta üst üste işareti koyulabilir. Dolayısıyla, şu iki etiket eşdeğerdir:
//my/app/lib
//my/app/lib:lib
Paketin alt dizinindeki bir dosya hedefinin adı, dosyanın yoludur
kök dizin (BUILD
dosyasını içeren dizin) ile ilişkilidir. Dolayısıyla,
bu dosya, deponun my/app/main/testdata
alt dizininde bulunuyor:
//my/app/main:testdata/input.txt
//my/app
ve @@some_repo//my/app
gibi dizelerin bağlı olarak iki anlamı vardır
bağlam hakkında daha fazla bilgi edineceksiniz. Bazel bir etiket beklediğinde
Sırasıyla //my/app:app
ve @@some_repo//my/app:app
. Ancak, Bazel
bir paket beklediğinde (ör. package_group
spesifikasyonlarında)
paketinin yanındaki kutuyu işaretleyin.
BUILD
dosyalarında sık yapılan bir hata, bir pakete atıfta bulunmak için //my/app
kullanılmasıdır veya
tüm hedeflere ekleme yapar. Unutmayın,
//my/app:app
ile eşdeğerdir; dolayısıyla, app
hedefini my/app
paketinin tüm özellikleri dahil edilir.
Bununla birlikte, //my/app
bir package_group
veya .bzl
dosyası için
paket adının mutlak olduğunu ve üst düzey dizinde kökten kaynaklandığını bildirir
çalışma alanı dizini oluşturur.
Göreli etiketler, diğer paketlerdeki hedeflere başvuruda bulunmak için kullanılamaz; "the"
depo tanımlayıcısı ve paket adı bu durumda her zaman belirtilmelidir.
Örneğin, kaynak ağaç hem my/app
paketini hem de
my/app/testdata
paketi (bu iki dizinden her birinin kendi paketi
BUILD
dosyası) kullanıyorsanız ikinci paket testdepot.zip
adlı bir dosya içerir. Burası
iki farklı şekilde (biri yanlış, biri doğru)
//my/app:BUILD
:
Yanlış: testdata
farklı bir paket olduğundan göreli yol kullanamazsınız
testdata/testdepot.zip
Doğru: Tam yoluyla testdata
için bakın
//my/app/testdata:testdepot.zip
@@//
ile başlayan etiketler, ana
çalışmaya devam eder.
Bu nedenle @@//a/b/c
,
//a/b/c
.
İlk depo ana depo, ikinci depo ise
harici depoda //a/b/c
araması yapar.
Bu, özellikle de temel
ana depodaki hedeflere işaret eden ve
bu verileri kullanır.
Hedeflere atıfta bulunmanın farklı yolları hakkında bilgi için hedef kalıpları.
Etiketin sözcüksel spesifikasyonu
Etiket söz dizimi, açıkça kabuktur. Bu sayede yanlışlıkla alıntı sorunlarını önleyebilir ve ekip üyelerinizden etiketler oluşturmak gibi etiketler oluşturan araçlar ve komut dosyaları oluşturabilirsiniz; örneğin Bazel Sorgu Dili.
İzin verilen hedef adlarının tam ayrıntıları aşağıda verilmiştir.
Hedef adlar — package-name:target-name
target-name
, paketteki hedefin adıdır. Kuralın adı
BUILD
kuralının bildirimindeki name
özelliğinin değeridir
file; bir dosyanın adı,
BUILD
dosyası.
Hedef adlar, tamamen a
–z
kümesindeki karakterlerden oluşmalıdır
A
–Z
, 0
-9
ve noktalama işaretleri !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
.
Dosya adları normal biçimde göreli yol adları olmalıdır; diğer bir deyişle,
başında veya sonunda eğik çizgiyle geçmez (örneğin, /foo
ve foo/
yasaktır) ve yol ayırıcı olarak art arda birden fazla eğik çizgi içermemelidir
(örneğin, foo//bar
). Benzer şekilde, üst düzey referanslar (..
) ve
mevcut dizin başvuruları (./
) yasaktır.
Yanlış: Diğer paketlerdeki dosyalara referans vermek için ..
kullanılmamalıdır
Doğru: Kullanın
//package-name:filename
Dosya hedefi adında /
yaygın olarak kullanılsa da
Kural adlarında /
. Özellikle bir etiketin kısaltılmış biçimi
okuyucunun kafasını karıştırabilir. //foo/bar/wiz
etiketi her zaman bir kısaltmadır
//foo/bar/wiz:wiz
için, foo/bar/wiz
gibi bir paket olmasa bile; o
hiçbir zaman //foo:bar/wiz
değerine başvuruda bulunmaz (söz konusu hedef mevcut olsa bile).
Bununla birlikte, eğik çizgi kullanmanın kullanışlı olduğu bazı durumlar veya hatta bazen gerekli olabilir. Örneğin, belirli kuralların adı ana kaynak dosyaları oluşturun. Bu dosyalar, paketin bir alt dizininde bulunabilir.
Paket adları — //package-name:target-name
Paketin adı, BUILD
dosyasını içeren dizinin adıdır.
depolandığı deponun en üst düzey dizinine kıyasla.
Örnek: my/app
.
Bazel teknik düzeyde şunları zorunlu kılar:
- Paket adlarında izin verilen karakterler şu küçük harflerdir:
a
-z
A
ileZ
arasındaki büyük harfler,0
ile9
arasındaki rakamlar, karakter! \"#$%&'()*+,-.;<=>?@[]^_`{|}
(evet, boşluk karakteri var ve elbette/
eğik çizgiyi (çünkü dizin olduğu için) ayırıcı). - Paket adları, öne eğik çizgi karakteriyle (
/
) başlayamaz veya bitemez. - Paket adları
//
alt dizesini içeremez. Bu, projenin anlamlı dizin yolu ne olurdu? - Paket adları
/./
,/../
veya/.../
alt dizesini içeremez. Bu yaptırım, mantıksal bir çeviri sırasında nokta karakteridir.
Pratik bir düzeyde:
- Modülü açısından önemli bir dizin yapısına sahip olan bir dil için sistemi için (örneğin, Java) aynı dizinde değil, aynı zamanda geçerli tanımlayıcılara sahip olmanız gerekir. Örneğin, başta girin ve özel karakterler, özellikle de alt çizgi ve kısa çizgi kullanmaktan kaçının.
- Bazel, çalışma alanının kök paketindeki hedefleri desteklese de (örneğin,
//:foo
) olduğu durumlarda, tüm anlamlı paketlerin hepsi için bu paketi boş bırakmanız en iyi açıklayıcı adlara sahiptir.
Kurallar
Bir kural, girişler ve çıkışlar arasındaki ilişkiyi belirtir ve bu adımları gözden geçirin. Kurallar birçok farklı olabilir kural sınıfı olarak da adlandırılır. yürütülebilir dosyalar ve kitaplıklar, yürütülebilir dosyaları test çıkışları Ansiklopedi Oluşturma konusunda açıklandığı gibidir.
BUILD
dosyaları, kuralları çağırarak hedefleri bildirir.
Aşağıdaki örnekte my_app
hedefinin beyanını görüyoruz.
(cc_binary
kuralı) kullanılıyor.
cc_binary(
name = "my_app",
srcs = ["my_app.cc"],
deps = [
"//absl/base",
"//absl/strings",
],
)
Her kural çağrısının bir name
özelliği vardır (bu özellik geçerli bir
target name) içerir.
BUILD
dosyasından oluşur.
Her kuralın bir dizi özellikleri vardır; ve her bir ürün için geçerli özellikleri her özelliğin önem ve anlamı bir fonksiyonudur. nasıl bir kural olur? daha fazla bilgi edinmek için Ansiklopedi Oluşturma ve bunlarla ilişkili özellikleri içerir. Her özelliğin bir adı ve tür. Özniteliğin sahip olabileceği yaygın türlerden bazıları tam sayı, etiket, liste etiket listesi, dize, dize listesi, çıkış etiketi, çıkış etiketleri listesi. Değil her kuralda tüm özelliklerin belirtilmesi gerekir. Böylece özellikler anahtarlardan (adlardan) isteğe bağlı, yazılan değerlere kadar pek çok işlevi kullanıma sunduk.
Birçok kuralda bulunan srcs
özelliği "etiket listesi" türüne sahiptir; onun
değeri varsa, her biri özel bir hedefin adı olan etiketlerden oluşan bir listedir.
giriş yapalım.
Bazı durumlarda, kural türünün adı biraz isteğe bağlıdır. kural tarafından oluşturulan dosyaların adları ilgi çekicidir ve genrules. Daha fazla bilgi için bkz. Genel Kurallar: genrule.
Diğer durumlarda ad önemlidir: *_binary
ve *_test
kuralları için
örneğin, kural adı
seçeceğim.
Hedeflerin üzerindeki bu yönlendirilmiş grafik, hedef grafik veya bağımlılık grafiği oluştur ve bağımlılığın Bazel Sorgu aracı çalışır.
Hedefler | Dosya derleyin |