Etiketler

Sorun bildir Kaynağı göster

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 az, AZ, 09 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ı