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

Sorun bildir Kaynağı göster

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.

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 deponun WORKSPACE 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'lerle http_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 ve C'e bağlıdır; B ve C ikisi de D'in farklı sürümlerine bağlıdır).

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.