Etiketler

Sorun bildir Kaynağı göster Gece · 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 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 az kümesindeki karakterlerden oluşmalıdır AZ, 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 ile Z arasındaki büyük harfler, 0 ile 9 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ı tamsayı, 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 bu doğru 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