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.
Çalışma alanı
Tüm Bazel komutlarının paylaştığı ortam aynı ana depoda çalışır.
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//pac/kage: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//pac/kage: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.
Bzlmod'daki harici bağlantılar
- bazelbuild/örneklerde Bzlmod kullanım örnekleri
- Bazel Dış Bağımlılıkları Revizyon (orijinal Bzlmod tasarım dokümanı)
- Bzlmod'da BazelCon 2021 konuşması
- Bzlmod'da Bazel Topluluk Günü konuşması
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'lerlehttp_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
veC
;B
veC
,D
ürününün farklı sürümlerine bağlıdır.
- Bunun kendi sorunları vardır: makrolar diğer
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.