Bazel, derlemenizde kullanılan ve çalışma alanınızda olmayan harici bağımlılıkları, kaynak dosyalarını (hem metin hem de ikili dosyaları) destekler. Örneğin, bunlar GitHub deposunda barındırılan bir kural kümesi, Maven yapısı veya mevcut çalışma alanınızın dışındaki yerel makinenizde bulunan bir dizin olabilir.
Bazel 6.0'dan itibaren Bazel ile dış bağımlılıkları yönetmenin iki yolu vardır: geleneksel, depo odaklı WORKSPACE
sistemi ve modül odaklı daha yeni MODULE.bazel
sistemi (Bzlmod olarak adlandırılmış ve --enable_bzlmod
işaretiyle etkinleştirilmiştir). İki sistem birlikte kullanılabilir ancak Bzlmod, gelecekte Bazel'den geçiş yapmak için Bzlmod'un yerini nasıl değiştiriyor{/?WORKSPACE
Bu belgede, sırasıyla iki sistemi daha ayrıntılı bir şekilde ele almadan önce Bazel'deki dış bağımlılık yönetimi ile ilgili kavramlar açıklanmaktadır.
Kavramlar
Depo
Bazel derlemesinde kullanılacak kaynak dosyaları içeren WORKSPACE
veya WORKSPACE.bazel
dosyasına sahip bir dizin. Genellikle yalnızca 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 bir arada kullanıldığını unutmayın. "Çalışma alanı" terimi çoğu zaman ana veri deposunu ifade etmek için, hatta bazen "depo" kelimesiyle eş anlamlı olarak bile kullanılmıştır.
Standart kod deposu adı
Deponun adreslenebileceği standart addır. Çalışma alanı bağlamında her deponun tek bir standart adı vardır. Standart adı canonical_name
olan depo içindeki bir hedef, @@canonical_name//pac/kage:target
etiketiyle ele alınabilir (çift @
'ye dikkat edin).
Ana depoda standart ad olarak her zaman boş dize bulunur.
Belirgin depo adı
Başka bir depo bağlamında kullanabilen depo adı.
Bu, deponun "takma adı" olarak düşünülebilir: michael
kod deposuna sahip depo, alice
bağlamında görünen mike
adına sahip olsa da bob
bağlamında mickey
görünebilir. Bu durumda, michael
içindeki bir hedef, alice
bağlamında @mike//pac/kage:target
etiketiyle ele alınabilir (tek @
öğesine dikkat edin).
Bu, depo eşlemesi olarak da anlaşılabilir. Her depo, "görünen depo adı" ile "standart depo adı" arasındaki bir eşlemeyi korur.
Kod deposu kuralı
Depo tanımlarına yönelik bir şemadır ve Bazel'a bir depoyu nasıl gerçekleştireceğini anlatır. Örneğin, "belirli bir URL'den zip arşivi indirin ve çıkarın", "belirli bir Maven yapısını getirin ve java_import
hedefi olarak kullanıma sunun" ya da "yerel bir dizinin sembolüyle bağlantı oluşturun" olabilir. Her depo, uygun sayıda bağımsız değişkene sahip bir depo kuralının çağrılmasıyla tanımlanır.
Kendi depo kurallarınızı yazma hakkında daha fazla bilgi için Depo kuralları bölümüne bakın.
Şu ana kadarki en yaygın depo kuralları, bir URL'den bir arşiv indiren ve onu çıkaran http_archive
ile zaten bir Bazel deposu olan yerel bir dizini sembolik hale getiren local_repository
'tir.
Kod deposu getirin
Bir depoyu ilişkili depo kuralını çalıştırarak yerel diskte kullanılabilir hale getirme işlemi. Çalışma alanında tanımlanan depolar, getirilmeden önce yerel disk üzerinde kullanılamaz.
Normalde, Bazel bir depoyu yalnızca kod deposundan bir şey gerektiğinde ve henüz getirilmediğinde getirir. Depo daha önce getirilmişse Bazel yalnızca tanımı değiştiyse tekrar getirir.
Dizin düzeni
Getirildikten sonra depo, çıktı tabanındaki external
alt dizininde, standart adının altında bulunabilir.
canonical_name
standart adıyla depo içeriğini görmek için aşağıdaki komutu çalıştırabilirsiniz:
ls $(bazel info output_base)/external/ canonical_name
Bzlmod ile dış bağımlılıkları yönetin
Yeni dış bağımlılık alt sistemi Bzlmod, depo tanımlarıyla doğrudan çalışmaz. Bunun yerine modüllerden bir bağımlılık grafiği oluşturur, grafiğin üst kısmında extensions çalıştırır ve depoları buna göre tanımlar.
Bazel modülü, birden çok sürüme sahip olabilen bir Bazel projesidir. Her sürüm, bağımlı olduğu diğer modüller hakkında meta veriler yayınlar. Modülün deposunda, WORKSPACE
dosyasının yanında MODULE.bazel
dosyası olmalıdır. Bu dosya, diğer bilgilerin yanı sıra modülün adını, sürümünü, bağımlılık listesini ve modülün manifest dosyasıdır. 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")
Modül yalnızca Bzlmod'un bir Bazel kayıt otoritesinde (varsayılan olarak Bazel CentralRegistry) aradığı doğrudan bağımlılıklarını listelemelidir. Kayıt defteri, bağımlıların MODULE.bazel
dosyalarını sağlar. Bu dosyalar, Bazel'in sürüm çözünürlüğünü 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 otoritesine tekrar danışır.
Modüller, etiket adı verilen özelleştirilmiş veri parçalarını da belirtebilir. Bu veriler, modül çözünürlüğünden 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/Ç'si ve ağ istekleri gönderme gibi işlemleri gerçekleştirmelerine olanak tanır. Diğer olanaklarının yanı sıra, 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 uyar.
Bzlmod'daki harici bağlantılar
- Bazelbuild/örneklerde Bzlmod kullanım örnekleri
- Bazel Dış Bağımlılık Revizyonu (orijinal Bzlmod tasarım belgesi)
- BazelCon 2021 Bzlmod konuşması
- Bzlmod'daki Bazel Topluluk Günü konuşması
Depoları WORKSPACE
ile 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
deposu kuralının kullanımına ö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ımlar. WORKSPACE
sisteminde varsayılan olarak, bir deponun standart adı aynı zamanda diğer tüm depolar için de görünen addır.
WORKSPACE
sisteminin eksiklikleri
WORKSPACE
sisteminin kullanıma sunulmasından bu yana geçen yıllarda kullanıcılar birçok sorun bildirdi. Bunlardan bazıları:
- Bazel herhangi bir bağımlılığın
WORKSPACE
dosyalarını değerlendirmez. Bu nedenle, doğrudan bağımlılıkların yanı sıra tüm geçişli bağımlılıklar ana deponunWORKSPACE
dosyasında tanımlanmalıdır. - Bu sorunu gidermek için projeler "deps.bzl" kalıbını benimsemiştir. Bu kalıpta, birden çok depo 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
yapamaz. Dolayısıyla bu projelerin, bu "deps" makrosunda geçişli bağımlılıklarını tanımlaması veya kullanıcının çok katmanlı "deps" makrolarını çağırmasını sağlayarak bu soruna çözüm getirmesi 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ı söz konusu olduğunda sürüm çözünürlüğünü gerçekleştirmenin güvenilir bir yolu olmadığı anlamına gelir (A
,B
veC
'e bağlıdır;B
veC
ikisi deD
'in farklı sürümlerine bağlıdır).
- Bunun kendi sorunları vardır: Makrolar diğer
WORKSPACE'teki eksiklikler nedeniyle Bzlmod, gelecekteki Bazel sürümlerinde eski WORKSPACE sisteminin yerini alacaktır. Lütfen Bzlmod'a nasıl geçiş yapılacağını anlatan Bzlmod taşıma kılavuzunu okuyun.