Bazel modülleri

Bazel modülü, birden fazla sürümü olabilen bir Bazel projesidir. Bu sürümlerin her biri, bağlı olduğu diğer modüllerle ilgili meta veriler yayınlar. Bu, diğer bağımlılık yönetimi sistemlerindeki bilinen kavramlara benzer. Örneğin, Maven artifact, npm package, Go module veya Cargo crate.

Bir modülün, depo kökünde MODULE.bazel dosyası olmalıdır. Bu dosya, modülün manifest dosyasıdır. Modülün adını, sürümünü, doğrudan bağımlılıklarının listesini ve diğer bilgilerini içerir. Temel bir örnek için:

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

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

MODULE.bazel dosyalarında kullanılabilen yönergelerin tam listesini inceleyin.

Bazel, modül çözümlemesini gerçekleştirmek için önce kök modülün MODULE.bazel dosyasını okuyarak başlar ve ardından tüm bağımlılıkların MODULE.bazel dosyasını Bazel kayıt defterinden tekrar tekrar ister. Bu işlem, bağımlılık grafiğinin tamamı keşfedilene kadar devam eder.

Bazel, varsayılan olarak kullanılacak her modülün bir sürümünü seçer. Bazel, her modülü bir depo ile temsil eder ve her bir deponun nasıl tanımlanacağını öğrenmek için kayıt defterine tekrar danışır.

Sürüm biçimi

Bazel'in çeşitli bir ekosistemi vardır ve projelerde çeşitli sürüm oluşturma şemaları kullanılır. En popüler olanı SemVer olsa da Abseil gibi farklı şemalar kullanan önemli projeler de vardır (ör. 20210324.2). Abseil'in sürümleri tarihe dayalıdır.

Bu nedenle Bazel, SemVer spesifikasyonunun daha esnek bir sürümünü kullanır. Farklılıklar şunlardır:

  • SemVer, sürümün "yayın" bölümünün 3 segmentten oluşması gerektiğini belirtir: MAJOR.MINOR.PATCH. Bazel'de bu şart gevşetilir ve herhangi bir sayıda segmente izin verilir.
  • SemVer'de "yayın" bölümündeki segmentlerin her biri yalnızca rakamlardan oluşmalıdır. Bazel'de bu kısıtlama, harflere de izin verecek şekilde gevşetilir ve karşılaştırma semantiği, "ön sürüm" bölümündeki "tanımlayıcılarla" eşleşir.
  • Ayrıca, ana, alt ve yama sürümü artışlarının semantiği zorunlu kılınmaz.

Geçerli herhangi bir SemVer sürümü, geçerli bir Bazel modül sürümüdür. Ayrıca, iki SemVer sürümü a ve b, yalnızca Bazel modül sürümleri olarak karşılaştırıldıklarında aynı durum geçerliyse a < b karşılaştırılır.

Son olarak, modül sürümü oluşturma hakkında daha fazla bilgi edinmek için SSS bölümüne bakın.MODULE.bazel

Sürüm seçimi

Sürüm oluşturulmuş bağımlılık yönetimi alanında temel bir sorun olan elmas bağımlılığı sorununu göz önünde bulundurun. Bağımlılık grafiğinizin aşağıdaki gibi olduğunu varsayalım:

       A 1.0
      /     \
   B 1.0    C 1.1
     |        |
   D 1.0    D 1.1

Hangi D sürümü kullanılmalıdır? Bazel, bu sorunu çözmek için Go modül sisteminde kullanıma sunulan Minimal Version Selection (MVS) algoritmasını kullanır. MVS, bir modülün tüm yeni sürümlerinin geriye dönük olarak uyumlu olduğunu varsayar ve bu nedenle bağımlı olan herhangi bir öğe (örneğimizde D 1.1) tarafından belirtilen en yüksek sürümü seçer. Bu sürüm, şartlarımızı karşılayabilecek en eski sürüm olduğu için "minimal" olarak adlandırılır. D 1.2 veya daha yeni sürümler olsa bile bunları seçmeyiz.D 1.1 MVS kullanmak, yüksek doğrulukta ve yeniden üretilebilir bir sürüm seçme süreci oluşturur.

Kaldırılan sürümler

Kayıt, belirli sürümlerin (ör. güvenlik açıkları nedeniyle) kullanılmaması gerektiğini belirtmek için bu sürümleri yanked olarak bildirebilir. Bazel, bir modülün yanked sürümü seçildiğinde hata veriyor. Bu hatayı düzeltmek için daha yeni ve geri çekilmemiş bir sürüme yükseltin veya geri çekilmiş sürüme açıkça izin vermek için --allow_yanked_versions işaretini kullanın.

Geçersiz kılar:

Bazel modülü çözümlemesinin davranışını değiştirmek için MODULE.bazel dosyasında geçersiz kılmaları belirtin. Yalnızca kök modülün geçersiz kılmaları geçerli olur. Bir modül bağımlılık olarak kullanılıyorsa geçersiz kılmaları yoksayılır.

Her geçersiz kılma işlemi belirli bir modül adı için belirtilir ve bağımlılık grafiğindeki tüm sürümlerini etkiler. Yalnızca kök modülün geçersiz kılmaları geçerli olsa da bunlar, kök modülün doğrudan bağlı olmadığı geçişli bağımlılıklar için olabilir.

Tek sürümü geçersiz kılma

single_version_override çeşitli amaçlara hizmet eder:

  • version özelliğiyle, bağımlılık grafiğinde hangi bağımlılık sürümlerinin istendiğinden bağımsız olarak bir bağımlılığı belirli bir sürüme sabitleyebilirsiniz.
  • registry özniteliğiyle, normal kayıt defteri seçimi sürecini izlemek yerine bu bağımlılığın belirli bir kayıt defterinden gelmesini zorlayabilirsiniz.
  • patch* özellikleri ile indirilen modüle uygulanacak bir yama grubu belirtebilirsiniz.

Bu özelliklerin tümü isteğe bağlıdır ve birbirleriyle karıştırılıp eşleştirilebilir.

Birden fazla sürümü geçersiz kılma

Aynı modülün birden fazla sürümünün çözümlenen bağımlılık grafiğinde birlikte bulunmasına izin vermek için multiple_version_override belirtilebilir.

Bağımlılık grafiğinde aynı modülün birden fazla sürümü kalırsa Bazel, her bağımlı için izin verilen en yakın yüksek sürümü seçer.

Örneğin, çözümlemeden önce bağımlılık grafiğinde 1.1, 1.3, 1.5, 1.7 ve 2.0 sürümleri varsa:

  • 1.3, 1.7 ve 2.0'ye izin veren çok sürümlü bir geçersiz kılma işlemi sonucunda 1.1, 1.3'ya, 1.5 ise 1.7'ye yükseltilir ve diğer sürümler aynı kalır.
  • 1.9 ve 2.0'ye izin veren çok sürümlü geçersiz kılma işlemi, 1.9 çözümlenmeden önce bağımlılık grafiğinde bulunmadığı için hataya neden olur.

Ayrıca kullanıcılar, tek sürümlü geçersiz kılmalara benzer şekilde registry özelliğini kullanarak kayıt defterini geçersiz kılabilir.

Kayıt dışı geçersiz kılma işlemleri

Kayıt dışı geçersiz kılmalar, bir modülü sürüm çözümlemeden tamamen kaldırır. Bazel, bu MODULE.bazel dosyaları bir kayıt defterinden değil, doğrudan depodan ister.

Bazel aşağıdaki kayıt dışı geçersiz kılmaları destekler:

Kaynak arşivde MODULE.bazel sürüm değeri ayarlamanın, modül kayıt dışı bir geçersiz kılma ile geçersiz kılınırken dezavantajları olabileceğini unutmayın. Bu konu hakkında daha fazla bilgi edinmek için MODULE.bazel SSS bölümüne bakın.

Bazel modüllerini temsil etmeyen depoları tanımlama

bazel_dep ile diğer Bazel modüllerini temsil eden depolar tanımlayabilirsiniz. Bazen Bazel modülünü temsil etmeyen bir depo tanımlamak gerekir. Örneğin, veri olarak okunacak düz bir JSON dosyası içeren bir depo.

Bu durumda, bir depo kuralı çağırarak doğrudan bir depo tanımlamak için use_repo_rule yönergesini kullanabilirsiniz. Bu depo yalnızca tanımlandığı modül tarafından görülebilir.

Bu özellik, arka planda module extensions ile aynı mekanizma kullanılarak uygulanır. Bu mekanizma, depoları daha esnek bir şekilde tanımlamanıza olanak tanır.

Depo adları ve katı bağımlılıklar

Bir modülü doğrudan bağımlılarına destekleyen bir deponun görünen adı, bazel_dep yönergesinin repo_name özelliği aksi yönde bir ifade içermediği sürece varsayılan olarak modül adı olur. Bu durumda bir modülün yalnızca doğrudan bağımlılıklarını bulabileceğini unutmayın. Bu, geçişli bağımlılıklardaki değişiklikler nedeniyle yanlışlıkla bozulmaları önlemeye yardımcı olur.

Bir modülü destekleyen deponun standart adı, bağımlılık grafiğinin tamamında modülün birden fazla sürümü olup olmadığına bağlı olarak module_name+version (örneğin, bazel_skylib+1.0.3) veya module_name+ (örneğin, bazel_features+) olur (bkz. multiple_version_override). Standart ad biçiminin, bağımlı olmanız gereken bir API olmadığını ve herhangi bir zamanda değişebileceğini unutmayın. Standart adı sabit kodlamak yerine, doğrudan Bazel'den almak için desteklenen bir yöntem kullanın:

  • BUILD ve .bzl dosyalarında, deponun görünen adıyla verilen bir etiket dizesinden oluşturulan bir Label örneğinde Label.repo_name kullanın. Örneğin: Label("@bazel_skylib").repo_name.
  • Çalıştırma dosyalarını ararken $(rlocationpath ...) veya @bazel_tools//tools/{bash,cpp,java}/runfiles içindeki çalıştırma dosyası kitaplıklarından birini ya da rules_foo kurallar grubu için @rules_foo//foo/runfiles içindeki çalıştırma dosyası kitaplıklarından birini kullanın.
  • IDE veya dil sunucusu gibi harici bir araçtan Bazel ile etkileşimde bulunurken, belirli bir dizi depo için görünen adlardan standart adlara eşlemeyi almak üzere bazel mod dump_repo_mapping komutunu kullanın.

Modül uzantıları, bir modülün görünür kapsamına ek depolar da ekleyebilir.