Dış bağımlılıklara genel bakış

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bazel harici bağımlılıkları ve kullanılan kaynak dosyaları (hem metin hem de ikili program) destekler derlemeniz gerekir. Örneğin, GitHub deposunda, Maven yapısında veya yerel mevcut çalışma alanınızın dışında tutun.

Bazel 6.0 sürümünden itibaren, dış bağımlılıkları Bazel ile yönetmenin iki yolu vardır: geleneksel, depo odaklı WORKSPACE sistemi ve yeni modül odaklı MODULE.bazel sistemi (kod adı Bzlmod, ve --enable_bzlmod işaretiyle etkinleştirilir. Bu iki sistem kullanılabilir ancak Bzlmod gelecekte Bazel'in yerine WORKSPACE sisteminin yerini alacak hakkında daha fazla bilgi edinmek için Bzlmod taşıma rehberine taşıma.

Bu belgede dış bağımlılık yönetimiyle ilgili kavramlar açıklanmaktadır konusuna değindik.

Kavramlar

Kod deposu

Kökünde bir sınır işaretçisi dosyası bulunan ve kaynak içeren bir dizin ağacı dosyaları oluşturabilirsiniz. Genellikle depo olarak kısaltılır.

Depo sınır işaretçi dosyası MODULE.bazel olabilir (bu deponun bir Bazel modülünü temsil eder), REPO.bazel (aşağıya bakın) veya eski bağlamlar, WORKSPACE veya WORKSPACE.bazel. Herhangi bir depo sınır işaretçi dosyası kod deposunun sınırını belirtir; bu tür birden fazla dosya bir arada dizin.

Ana depo

Geçerli Bazel komutunun çalıştırıldığı depo.

Ana deponun kökü aynı zamanda workspace kök.

Çalışma alanı

Tüm Bazel komutlarının paylaştığı ortam aynı ana depoda çalışır. Google ana depoyu ve tanımlanmış tüm harici depoları kapsar.

Geçmişte “depo” kavramlarının ve "workspace", oldu birleştirilmiş; "çalışma alanı" terimi genellikle proje yaşam döngüsünde veri deposudur ve bazen "depo" ile eş anlamlı olarak da kullanılır.

Standart depo adı

Bir deponun adreslenebileceği kurallı ad. Şu bağlamda: her deponun tek bir standart adı olur. Depo içindeki bir hedef Standart adı canonical_name olan kullanıcılar etiket tarafından çözülebilir @@canonical_name//package:target (çift @ değerine dikkat edin).

Ana depoda standart ad olarak her zaman boş dize bulunur.

Görünen depo adı

Bir depoya, başka bir depo bağlamında hitap edilebilir. Bu, deponun "takma adı" olarak düşünülebilir: Standart ada sahip depo michael, depo bağlamında mike olarak görünen ada sahip olabilir alice, ancak depo bağlamında mickey olarak görünen ada sahip olabilir bob. Bu durumda, michael içindeki bir hedef etiket tarafından ele alınabilir alice bağlamında @mike//package:target (@ öğesine dikkat edin).

Buna karşılık, bu bir depo eşlemesi olarak da anlaşılabilir: her depo "görünen kod deposu adı"ndan bir eşlemeyi korur "standart depo adına" dönüştürmenizi öneririz.

Depo kuralı

Bazel'a bir materyalin nasıl gerçeğe dönüştürüleceğini anlatan, depo depodur. Örneğin, "belirli bir URL'den bir ZIP arşivi indir" olabilir veya "belirli bir Maven eserini getirin ve bunu bir sonraki java_import hedefi" veya basitçe "yerel bir dizini simgesel bağlayın". Her depo uygun sayıda bağımsız değişkene sahip bir depo kuralı çağırarak tanımlanır.

Nasıl yazılacağı hakkında daha fazla bilgi için Depo kuralları bölümüne bakın depo kurallarınızı da oluşturabilirsiniz.

Şu ana kadar en yaygın olan depo kuralları http_archive: Arşiv indirir URL'den çıkarıp çıkarır ve local_repository, şu anlama gelir: yerel dizindir.

Kod deposu getir

Bir depoyu ilişkili çalıştırarak yerel diskte kullanılabilir hale getirme işlemi depo kuralı. Bir çalışma alanında tanımlanan kod depoları, yerel diskte kullanılamıyor getirmesi gerekir.

Normalde, Bazel bir depoyu yalnızca depodan bir şey gerektiğinde getirir. ve depo getirilmedi. Depo zaten getirildiyse daha önce, Bazel yalnızca tanımı değiştiyse yeniden getirir.

fetch komutu, depo için önceden getirme işlemini başlatmak amacıyla kullanılabilir. veya gerekli tüm depolar için kullanılabilir. Bu olanak --nofetch seçeneği kullanılarak çevrimdışı derlemeleri etkinleştirir.

--fetch seçeneği, ağ erişimini yönetmede yayınlanır. Varsayılan değeri "doğru"dur. Ancak, yanlış (--nofetch) değerine ayarlandığında komut, önbelleğe alınan tüm öğeleri kullanır sürümünü gerektirir. Yoksa komut, dosyanın başarısız olur.

Daha fazla bilgi için getirme seçeneklerini inceleyin getirme denetimiyle ilgili daha fazla bilgi edinin.

Dizin düzeni

Bu depo, getirildikten sonra external alt dizininde bulunabilir. çıktı tabanını standart adının altında bulabilirsiniz.

Şu komutu çalıştırarak deponun içeriğini standart ad canonical_name:

ls $(bazel info output_base)/external/ canonical_name 

REPO.bazel dosyası

REPO.bazel dosyası, dizin ağacının en üst sınırını işaretlemek için kullanılır kod depoları oluşturuyor. Depo olarak kullanılacak herhangi bir şey içermesi gerekmez. sınır dosyası Ancak bazı ortak özellikleri belirtmek için de kullanılabilir. tek bir kod deposuna sahip olduğundan emin olun.

REPO.bazel dosyasının söz dizimi BUILD dosyalarına benzerdir. Tek fark, dosyanın söz diziminin load ifadeleri desteklenir ve yalnızca tek bir işlev (repo()) kullanılabilir. repo(), package() ile aynı bağımsız değişkenleri alır fonksiyon BUILD dosyalarında; package() ise paketin içindeki tüm derleme hedefleri için ortak özellikleri belirtir, repo() aynı şekilde depodaki tüm derleme hedefleri için de geçerlidir.

Örneğin deponuzdaki tüm hedefler için ortak bir lisans belirtebilirsiniz. şu REPO.bazel dosyasına sahip:

repo(
    default_package_metadata = ["//:my_license"],
)

Dış bağımlılıkları Bzlmod ile yönetin

Yeni harici bağımlılık alt sistemi Bzlmod, depo ile doğrudan çalışmıyor tanımlar. Bunun yerine modüllerden bir bağımlılık grafiği oluşturur, extensions'ı gösterir ve depoları buna göre tanımlar.

Bazel modülleri, birden çok içerebilen Bazel projesidir. her biri, bağımlı olduğu diğer modüllerle ilgili meta verileri yayınlayan sürümler beklemeye gerek yoktur. Bir modülün depo kökünde bir MODULE.bazel dosyası, WORKSPACE dosya Bu dosya, modülün manifest adını belirten ve adını belirten bir manifestodur. bağımlıların listesini ve diğer bilgileri içerir. Aşağıdakiler, örnek:

module(name = "my-module", version = "1.0")

bazel_dep(name = "rules_cc", version = "0.0.1")
bazel_dep(name = "protobuf", version = "3.19.0")

Bir modül yalnızca Bzlmod'un tek bir programda aradığı doğrudan bağımlılıklarını listelemelidir. Bazel sicil dairesi — varsayılan olarak Bazel Central Kayıt otoritesi. Kayıt otoritesi bağımlılıklarının MODULE.bazel dosyalarını kullanarak Bazel'in geçişli bağımlılık grafiğine göz atın.

Her modül için bir sürümün seçildiği sürüm çözümlemesinden sonra, Bazel, her modüle yönelik bir depo tanımlamayı öğrenmek için kayıt defterine tekrar başvuruyor (çoğu durumda http_archive kullanılarak).

Modüller, etiketler adı verilen özelleştirilmiş veri parçalarını da belirtebilir. modül çözümlemesinden sonra modül uzantıları tarafından tüketilir ek veri havuzları tanımlamaktır. Bu uzantılar, depoya benzer özelliklere sahiptir kurallarıyla dosya G/Ç ve ağ gönderme gibi işlemler yapmalarını sağlar. kabul edersiniz. Diğer özelliklerin yanı sıra, Bazel'in diğer paketlerle aynı zamanda Bazel’den oluşturulan bağımlılık grafiğini de dikkate alarak modüllerinde yer alır.

WORKSPACE ile depo tanımlayın

Geçmişte, aynı hesapta depoları tanımlayarak dış bağımlılıkları WORKSPACE (veya WORKSPACE.bazel) dosyası. Bu dosya, Derleme kuralları yerine depo kuralları kullanan BUILD dosyaları.

Aşağıdaki snippet, http_archive kod deposu kuralını WORKSPACE dosyası:

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "foo",
    urls = ["https://example.com/foo.zip"],
    sha256 = "c9526390a7cd420fdcec2988b4f3626fe9c5b51e2959f685e8f4d170d1a9bd96",
)

Snippet, standart adı foo olan bir depoyu tanımlıyor. WORKSPACE içinde bir kod deposunun standart adı aynı zamanda tüm diğer depolar.

Şu ürünlerde bulunan işlevlerin tam listesine göz atın: WORKSPACE dosya.

WORKSPACE sistemindeki eksikler

WORKSPACE sisteminin kullanıma sunulmasından bu yana geçen yıllarda, kullanıcılar aşağıdakiler dahil olmak üzere birçok sorunlu nokta vardır:

  • Bazel herhangi bir bağımlılığın WORKSPACE dosyasını değerlendirmez. Dolayısıyla, geçişli bağımlılıklar anaWORKSPACE kod depolarını da içerir.
  • Bu sorunu çözmek için projelerde "deps.bzl" ve burada Buna karşılık birden fazla depoyu tanımlayan bir makro tanımlar ve kullanıcılardan bu makroyu WORKSPACE dosyalarında çağırabilir.
    • Bunun kendi sorunları vardır: makrolar diğer .bzl dosyalarını load. Bu nedenle, bu projelerin geçişli bağımlılıklarını tanımlaması, "dep" makrosuna sahip olabilir veya kullanıcının birden çok katmanlı "deps" makrolarında da yer alır.
    • Bazel, WORKSPACE dosyasını sırayla değerlendirir. Ayrıca, bağımlılıklar, herhangi bir değer belirtilmeden URL'lerle http_archive kullanılarak belirtilir sürüm bilgileri. Bu da, kötü amaçlı yazılım kullanma konusunda güvenilir bir yol olmadığı bağımlılıklarında sürüm çözünürlüğü kullanılabilir (A B ve C; B ve C, D ürününün farklı sürümlerine bağlıdır.

WORKSPACE eksiklikleri nedeniyle Bzlmod eski sürümün yerine Gelecekteki Bazel sürümlerinde WORKSPACE sistemi. Lütfen Bzlmod taşıma işlemini okuyun. rehberini inceleyin.