Bazel, derlemenizde kullanılan ve çalışma alanınızdan gelmeyen harici bağımlılıkları ve kaynak dosyalarını (hem metin hem de ikili program) destekler. Örneğin, GitHub deposunda barındırılan bir kural grubu, Maven yapısı veya mevcut çalışma alanınızın dışındaki yerel makinenizde bulunan bir dizin olabilir.
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 Bzlmod adlı yeni bir MODULE.bazel
sistemi (Bzlmod kodlu ve --enable_bzlmod
işaretiyle etkinleştirilir). Bu iki sistem birlikte kullanılabilir ancak Bzlmod, taşıma rehberinin
gelecekte
Bzl0'in yerini kontrol ediyor.WORKSPACE
Bu belgede Bazel'de dış bağımlılık yönetimini ele alan kavramlar açıklanmıştır. Ayrıca, sırayla iki sistem hakkında daha fazla ayrıntıya girilmelidir.
Kavramlar
Depo
Bazel derlemesinde kullanılacak kaynak dosyaları içeren WORKSPACE
veya WORKSPACE.bazel
dosyasına sahip bir dizin. Genellikle depo olarak kısaltılır.
Ana depo
Geçerli Bazel komutunun çalıştırıldığı depo.
Workspace
Tüm Bazel komutlarının paylaştığı ortam aynı ana depoda çalışır.
Geçmişte "depo" ve "çalışma alanı" kavramlarının karıştırıldığını unutmayın. "Çalışma alanı" terimi, genellikle ana depoyu ifade etmek için kullanılmış, hatta bazen "depo"nun eş anlamlısı olarak bile kullanılmıştır.
Standart depo adı
Bir deponun adreslenebileceği kurallı ad. Çalışma alanı bağlamında her deponun tek bir standart adı vardır. Bir depo içerisinde standart adı canonical_name
olan bir hedef, @@canonical_name//pac/kage:target
etiketi tarafından ele alınabilir (ç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 "rumuz" olarak düşünülebilir: michael
standart adlı depo,
alice
kod deposu bağlamında mike
görünen adına sahip
olabilir ancak depo bob
bağlamında mickey
olarak görünen ada
sahip olabilir. Bu durumda, michael
içindeki bir hedef, @mike//pac/kage:target
etiketi tarafından alice
bağlamında ele alınabilir (@
değerine dikkat edin).
Bu, depo eşlemesi olarak da anlaşılabilir: Her depo, "görünen kod deposu adı"ndan "standart depo adı"na eşleme sağlar.
Depo kuralı
Bazel'a bir depoyu nasıl gerçeğe dönüştüreceğini söyleyen depo tanımları için bir şema. Örneğin, "belirli bir URL'den bir zip arşivi indirip ayıklama", "belirli bir Maven yapısını alıp java_import
hedefi olarak kullanılabilir hale getirme" ya da "yerel bir dizini simge bağlama" şeklinde olabilir. Her depo, uygun sayıda bağımsız değişkene sahip bir depo kuralı çağırarak tanımlanır.
Kendi depo kurallarınızı nasıl yazacağınız hakkında daha fazla bilgi için Depo kuralları bölümüne bakın.
Şu ana kadar en sık kullanılan depo kuralları, URL'den arşiv indiren ve arşivlenen http_archive
ile zaten Bazel deposu olan yerel bir dizine sembolik bir bağlantı sunan local_repository
'tir.
Kod deposu getir
Bir depoyu, ilişkili depo kuralını çalıştırarak yerel diskte kullanılabilir hale getirme işlemi. Bir çalışma alanında tanımlanan depolar, getirilmeden önce yerel diskte kullanılamaz.
Normalde, Bazel bir depoyu yalnızca depodan bir şey gerektiğinde getirir ve depo henüz getirilmemiştir. Depo daha önce getirilmişse Bazel yalnızca tanımı değiştiyse yeniden getirir.
Dizin düzeni
Depo, getirildikten sonra çıkış tabanındaki external
alt dizininde, standart adının altında bulunabilir.
Standart ad olan canonical_name
ile deponun içeriğini görmek için aşağıdaki komutu çalıştırabilirsiniz:
ls $(bazel info output_base)/external/ canonical_name
Dış bağımlılıkları Bzlmod ile yönetin
Yeni harici bağımlılık alt sistemi Bzlmod, depo tanımlarıyla doğrudan çalışmamaktadır. Bunun yerine modüllerden bir bağımlılık grafiği oluşturur, grafiğin en üstünde uzantıları çalıştırır ve depoları buna göre tanımlar.
Bazel modülleri, her biri bağlı olduğu diğer modüllerle ilgili meta verileri yayınlayan, birden çok sürümü olabilen bir Bazel projesidir. Modüllerin kod deposu kökünde, WORKSPACE
dosyasının yanında bir MODULE.bazel
dosyası olmalıdır. Bu dosya, modülün manifest dosyasıdır ve adını, sürümünü, bağımlılık listesini ve diğer bilgileri bildirir. Aşağıda temel bir örnek verilmiştir:
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 bir Bazel kayıt otoritesinde (varsayılan olarak Bazel Merkez Kayıt otoritesi) aradığı doğrudan bağımlılıklarını listelemelidir. Kayıt defteri, bağımlılıkların MODULE.bazel
dosyalarını sağlar. Bu dosyalar, Bazel'in sürüm çözümlemesini gerçekleştirmeden önce geçişli bağımlılık grafiğinin tamamını keşfetmesine olanak tanır.
Her modül için bir sürümün seçildiği sürüm çözümlemesinden sonra Bazel, her modül için bir depo tanımlamayı (çoğu durumda http_archive
kullanarak) öğrenmek üzere kayıt defterine tekrar başvurur.
Modüller, etiketler adı verilen özelleştirilmiş veri parçalarını da belirtebilir. Bu veriler, modül çözümlemesinden sonra ek depolar tanımlamak için modül uzantıları tarafından kullanılır. Bu uzantılar, depo kurallarına benzer özellikler sunarak dosya G/Ç ve ağ istekleri gönderme gibi işlemleri gerçekleştirmelerini sağlar. Ayrıca, Bazel'in diğer paket yönetim sistemleriyle etkileşim kurmasına olanak tanırken Bazel modüllerinden oluşturulan bağımlılık grafiğine de saygı gösterirler.
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, WORKSPACE
(veya WORKSPACE.bazel
) dosyasında depoları tanımlayarak harici bağımlılıkları yönetebilirsiniz. Bu dosya, BUILD
dosyalarına benzer bir söz dizimine sahiptir ve derleme kuralları yerine depo kuralları kullanır.
Aşağıdaki snippet, WORKSPACE
dosyasında http_archive
kod deposu kuralını kullanmaya yönelik bir örnektir:
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
sisteminde, varsayılan olarak bir deponun standart adı aynı zamanda tüm diğer depolarda görünen addır.
WORKSPACE
sistemindeki eksikler
WORKSPACE
sisteminin kullanıma sunulmasından bu yana geçen yıllarda, kullanıcılar aşağıdakiler dahil birçok sorun bildirdi:
- Bazel herhangi bir bağımlılığın
WORKSPACE
dosyalarını değerlendirmez. Bu nedenle, doğrudan bağımlılıklara ek olarak tüm geçişli bağımlılıklar, ana deponunWORKSPACE
dosyasında tanımlanmalıdır. - Bu sorunu çözmek için projeler, "deps.bzl" kalıbını benimsemiştir. Bu kalıpta, birden çok depoyu tanımlayan bir makro tanımlanır ve kullanıcılardan bu makroyu
WORKSPACE
dosyalarında çağırmaları istenir.- Bunun kendi sorunları vardır: Makrolar diğer
.bzl
dosyalarınıload
işlemini gerçekleştiremez. Bu nedenle, söz konusu projelerin geçişli bağımlılıklarını bu "deps" makrosunda tanımlaması veya kullanıcının birden çok katmanlı "deps" makrolarını çağırmasını sağlayarak bu soruna geçici bir çözüm bulması gerekir. - Bazel,
WORKSPACE
dosyasını sırayla değerlendirir. Ayrıca bağımlılıklar, herhangi bir sürüm bilgisi olmadan URL'lerlehttp_archive
kullanılarak belirtilir. Bu, elmas bağımlılıkları durumunda sürüm çözümlemesi yapmanın güvenilir bir yolu olmadığı anlamına gelir (A
,B
veC
'a bağlıdır;B
veC
,D
sürümünün farklı sürümlerine bağlıdır).
- Bunun kendi sorunları vardır: Makrolar diğer
WORKSPACE eksiklikleri nedeniyle Bzlmod, gelecekteki Bazel sürümlerinde eski WORKSPACE sisteminin yerini alacaktır. Bzlmod'a geçiş hakkında bilgi edinmek için lütfen Bzlmod taşıma kılavuzunu okuyun.