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 kısmı, @@myrepo
kod deposu adıdır. Çift @
söz dizimi, bunun kurallı bir depo olduğunu belirtir
adı,
kontrol edebilirsiniz. Standart depo adlarına sahip etiketler, hangi bağlamda göründükleri fark etmeksizin bir hedefi açıkça tanımlar.
Kurallı depo adı genellikle @@rules_java~7.1.0~toolchains~local_jdk
gibi görünen anlaşılması zor bir dizedir. Daha yaygın olarak görülen, belirgin bir depo adıyla etiketlerdir. Bu etiketler şu şekilde 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, myrepo
görünen adına sahip bir deposu ifade eder. Bu etiketin göründüğü bağlama göre farklı olabilir.
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 kısmı, paketin depo köküne göre yolu olan niteliksiz paket adıdırmy/app/main
. Depo adı ve niteliksiz paket adı birlikte tam nitelikli paket adını@@myrepo//my/app/main
oluşturur. 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
Dosyalar için iki nokta işaretinin atlanması, kurallar için ise korunması bir kuraldır ancak bu durum başka bir şekilde önemli değildir.
Etiketin iki nokta işaretinden sonraki kısmı (app_binary
), niteliksiz hedef adıdır. Paket yolunun son bileşeniyle eşleştiğinde ve
iki nokta üst üste işareti koyulabilir. Bu nedenle, aşağıdaki iki etiket eşdeğerdir:
//my/app/lib
//my/app/lib:lib
Paketin bir alt dizinindeki dosya hedefini adı, dosyanın paket köküne (BUILD
dosyasını içeren dizin) göreli yoludur. Bu dosya, deponunun my/app/main/testdata
alt dizinindedir:
//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 içeriğini ele alalım.
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. //my/app:BUILD
içinde bu dosyaya referans vermenin iki yolu (biri yanlış, biri doğru) vardır:
Yanlış: testdata
farklı bir paket olduğundan göreli yol kullanamazsınız
testdata/testdepot.zip
Doğru: testdata
dosyasını tam yoluyla referans olarak kullanın.
//my/app/testdata:testdepot.zip
@@//
ile başlayan etiketler ana depoya yapılan referanslardır ve harici depolardan bile çalışmaya devam eder.
Bu nedenle, harici bir depodan referans verildiğinde @@//a/b/c
, //a/b/c
'ten farklıdır.
İlk depo ana depo, ikinci depo ise
harici depoda //a/b/c
araması yapar.
Bu, özellikle ana depoda, ana depodaki hedeflere atıfta bulunan ve harici depolardan kullanılacak kurallar yazarken önemlidir.
Hedeflere atıfta bulunmanın farklı yolları hakkında bilgi için hedef kalıpları.
Etiketin sözcüksel spesifikasyonu
Etiket söz dizimi, kabuk için özel anlamı olan meta karakterlerin kullanılmasını engeller. Bu, yanlışlıkla tırnak içine alma sorunlarını önlemeye yardımcı olur ve Bazel Sorgu Dili gibi etiketleri değiştiren araç ve komut dosyalarını oluşturmayı kolaylaştırır.
İ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
,
A
-Z
, 0
-9
kümesinden alınan karakterlerden ve !%-@^_"#$&'()*-+,;<=>?[]{|}~/.
noktalama işaretlerinden oluşmalıdır.
Dosya adları normal biçimdeki göreli yol adları olmalıdır. Yani dosya adları, eğik çizgiyle başlamamalı veya bitmemelidir (ö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 geçerli dizin referansları (./
) yasaktır.
Yanlış: Diğer paketlerdeki dosyaları belirtmek için ".." kullanmayın.
Doğru: Kullanın `//package-name:filename`
Dosya hedefi adında /
yaygın olarak kullanılsa da
Kural adlarında /
. Özellikle bir etiketin kısaltması kullanıldığında okuyucunun kafası karışabilir. //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.
dizinin en üst düzey diziniyle ilişkilidir.
Örneğin: my/app
.
Paket adları, tamamen kümeden alınan karakterlerden oluşmalıdır
A
-Z
, a
-z
, 0
-9
, "/
", "-
", ".
", "@
" ve "_
" olup olmadığının belirlenmesi için
eğik çizgiyle başlar.
Modül sistemi için önemli bir dizin yapısına sahip bir dil (ör. Java) söz konusu olduğunda, dilde geçerli tanımlayıcı olan dizin adları seçmek önemlidir.
Bazel, çalışma alanının kök paketindeki hedefleri (ör. //:foo
) desteklese de tüm anlamlı paketlerin açıklayıcı adlara sahip olması için bu paketi boş bırakmak en iyisidir.
Paket adları //
alt dizesini içeremez ve eğik çizgiyle bitemez.
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 tanımlar.
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ında, BUILD
dosyasının paketinde bir hedefi belirten bir name
özelliği (geçerli bir hedef adı olmalıdır) bulunur.
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 ilgili özellikleri içerir. Her özelliğin bir adı ve türü vardır. Bir özelliğin sahip olabileceği yaygın türlerden bazıları tam sayı, etiket, etiket listesi, dize, dize listesi, çıkış etiketi, çıkış etiketi listesidir. 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ğinin türü "etiket listesi"dir; varsa değeri, her biri bu kurala giriş olan bir hedefin adı olan etiketlerin listesidir.
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 bu doğru genrules. Daha fazla bilgi için bkz. Genel Kurallar: genrule.
Diğer durumlarda ise ad önemlidir: Örneğin, *_binary
ve *_test
kurallarında kural adı, derleme tarafından üretilen yürütülebilir dosyanın adını belirler.
Hedefler üzerindeki bu yönlendirilmiş acyclic grafiğe hedef grafiği veya derleme bağımlılık grafiği denir ve Bazel Sorgu aracının çalıştığı alandır.
Hedefler | BUILD dosyaları |