Etiketler

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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ı