Bazel modülleri

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bazel modül, her biri birden çok sürümü olabilen bir Bazel projesidir. Bu araç, bağımlı olduğu diğer modüllerle ilgili meta verileri yayınlar. Bu Bağımlılık Yönetimi sistemlerindeki bilinen kavramlara benzerdir. Maven yapısı, bir npm paketi, Go modülü veya Cargo crate'i.

Bir modülün kod deposu kökünde bir MODULE.bazel dosyası ( WORKSPACE dosya) ekleyebilirsiniz. Bu dosya, modülün manifest adını belirten ve adını belirten bir manifestodur. doğrudan bağımlılıkların listesi ve diğer bilgiler bulunur. Temel ö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")

MODULE.bazel dosyalarında bulunan yönergelerin tam listesine bakın.

Modül çözümlemesi yapmak için Bazel işe kök modülün MODULE.bazel dosyası kullanır ve ardından sürekli olarak herhangi bir bağımlılığı Bazel kayıt otoritesinden bu tarihe kadar MODULE.bazel dosya bağımlılık grafiğinin tamamını keşfeder.

Bazel varsayılan olarak her modülün bir sürümünü seçer tıklayın. Bazel, her bir modülü bir kod deposuyla temsil eder ve kayıt otoritesine danışır ilgili bölümlere göz atmayı unutmayın.

Sürüm biçimi

Bazel çeşitlilik içeren bir ekosisteme sahiptir ve projelerde çeşitli sürüm oluşturma şemaları kullanılmaktadır. İlgili içeriği oluşturmak için kullanılan en popüler olanı SemVer, ancak çeşitli şemaların kullanıldığı önemli projeler, örneğin Abseil sürümler tarihe dayalıdır (örneğin, 20210324.2).

Bu nedenle, Bzlmod SemVer spesifikasyonunun daha rahat bir sürümünü kullanır. İlgili içeriği oluşturmak için kullanılan farklılıklar şunları içerir:

  • SemVer, “yayınlanan” sürüm bölümü 3'ten oluşmalıdır segmentler: MAJOR.MINOR.PATCH. Bazel'de bu şart gevşetilmiştir. izin verilen belirli bir sayıda segmente izin verilir.
  • SemVer'de, "sürüm"deki segmentlerin her biri kısmı yalnızca rakamlardan oluşmalıdır. Bazel'de bu değer gevşetilerek harflere de izin verilir ve karşılaştırma anlamsal olarak "tanımlayıcılar" ile eşleşir "yayın öncesi"nde bölümü.
  • Ayrıca ana, alt ve yama sürümü artışlarının anlamları da zorunlu kılınmaz. Ancak aşağıdakiler için uyumluluk düzeyine bakın: ve geriye dönük uyumluluğu nasıl ifade ettiğimize ilişkin ayrıntılar içerir.

Geçerli herhangi bir SemVer sürümü, geçerli bir Bazel modülü sürümüdür. Buna ek olarak, a ve b SemVer sürümleri, yalnızca aynı koşullar aşağıdaki durumlarda korunduğunda a < b ile karşılaştırılır: Bazel modül sürümleri olarak karşılaştırıldı.

Sürüm seçimi

Sürümlü bağımlılığın temel unsurlarından biri olan elmas bağımlılık problemini düşünün yönetim alanında Aşağıdaki gibi bir bağımlılık grafiğiniz 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? Bzlmod, bu soruyu çözmek için Minimum Sürüm Seçimi (MVS) algoritması kullanıma sunuldu. MVS, tüm yeni içeriklerin sürümleri geriye dönük uyumludur; bu nedenle, en yüksek sürüm olan herhangi bir bağımlı tarafından belirtilir (örneğimizde D 1.1). Adı "minimal" çünkü D 1.1, gereksinimlerimizi karşılayabilecek ilk sürümdür — D 1.2 veya daha yeni bir dosya mevcut olsa bile bunlar seçilmez. MVS'yi kullanmak yüksek doğrulukta ve tekrarlanabilir bir sürüm seçme süreci

Yanklanan sürümler

Kaçınılması gereken belirli sürümler, kayıt otoritesi tarafından yanked olarak belirtilebilir. (örneğin, güvenlik açıkları için). Bazel, açılır menüden seçim yaparken yankı uygulanmış sürümü olabilir. Bu hatayı düzeltmek için daha yeni bir sürüme yükseltin yankı olmayan sürümü kullanın veya --allow_yanked_versions işaretini kullanın.

Uyumluluk düzeyi

Go'da MVS'nin geriye dönük uyumluluk varsayımı, geriye dönük uyumsuz sürümlerini ayrı bir modül olarak yükleyebilirsiniz. açısından Yani A 1.x ve A 2.x, ayrı modüller olarak kabul edilir ve çözülmüş bağımlılık grafiğinde bir arada bulunur. Bu da aynı zamanda ana sürümü kodlamak için hiçbir istek yok. derleme zamanı veya bağlantı zamanı çakışmaları olabilir.

Ancak Bazel bu tür garantileri sağlayamadığından "ana sürüme" ihtiyacı vardır sayısını kontrol etmek için kullanır. Bu numaranın adı: uyumluluk düzeyi, module() yönergesi. Bu bilgiler kullanıldığında, Bazel bir web sitesini ziyaret eden Aynı modülün sürümlerinin farklı uyumluluk düzeylerine sahip olduğunu algılar mevcuttur.

Geçersiz kılar:

Bazel'in davranışını değiştirmek için MODULE.bazel dosyasında geçersiz kılmaları belirtin modülünü kullanabilirsiniz. Yalnızca kök modülün geçersiz kılmaları geçerli olur. Modüller bu bağımlılığın geçersiz kılmaları yoksayılır.

Her geçersiz kılma, belirli bir modül adı için belirtilir ve onun tüm modüllerini etkiler değerlerini görebilirsiniz. Sadece kök modülün geçersiz kılmaları kök modülün sağlamadığı geçişli bağımlılıklar olabilir. bağlıdır.

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

single_version_override birden çok amaca hizmet eder:

  • version özelliğiyle, bir bağımlılığı belirli bir öğeye sabitleyebilirsiniz bağımlılığının hangi sürümlerinin istendiğine bakılmaksızın bağımlılık grafiğidir.
  • registry özelliğiyle, bu bağımlılığı normal kayıt defterini izlemek yerine seçim sürecini tamamlamalıdır.
  • patch* özellikleriyle, hangi yamaların uygulanacağını belirleyebilirsiniz indiremezsiniz.

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

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

multiple_version_override aynı modülün birden çok sürümünün bağımlılığı grafiğidir.

Modül için izin verilen sürümlerin açık bir listesini belirtebilirsiniz. çözüm öncesinde bağımlılık grafiğinde bulunmalıdır. İzin verilen her sürüme bağlı olarak bazı geçişli bağımlılıklar. Şu tarihten sonra: çözünürlükte, yalnızca modülün izin verilen sürümleri kalır, Bazel yükseltmeleri modülün diğer sürümlerini, aynı zamanda izin verilen en yakın yüksek sürüme uyumluluk düzeyiyle belirlenir. Aynı uyumlulukta izin verilen daha yüksek bir sürüm yoksa bir hata mesajı verir.

Örneğin,1.11.31.51.72.0 bağımlılık grafiğini görebilirsiniz. Ana sürüm ise, çözüldüğünde seviye:

  • 1.3, 1.7 ve 2.0 sonuçlarına izin veren birden çok sürüm geçersiz kılması 1.1 sürüm 1.3, 1.5 sürüm ise 1.7 sürümüne yükseltiliyor ve diğer kullanıcılar sürümü aynı kaldı.
  • 1.5 ve 2.0 özelliklerine izin veren birden fazla sürümü geçersiz kılma, aşağıdaki gibi hataya neden olur: 1.7, yeni sürüme geçirilecek aynı uyumluluk düzeyinde daha yüksek bir sürüme sahip değil.
  • 1.9 ve 2.0 özelliklerine izin veren birden fazla sürümü geçersiz kılma, aşağıdaki gibi hataya neden olur: Çözüm yapılmadan önceki bağımlılık grafiğinde 1.9 mevcut değil.

Ayrıca, kullanıcılar registry özelliğini kullanmanız gerekir.

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

Kayıt defteri olmayanlar, bir modülü sürüm çözünürlüğünden tamamen kaldırır. Bu durum, geçersiz kılma işlemlerini geçersiz kılar. Bazel bu MODULE.bazel dosyalarını bir kayıt defterinden değil, depoladığınızı düşünün.

Bazel, aşağıdaki kayıt defteri dışı geçersiz kılma işlemlerini destekler:

Bazel modüllerini temsil etmeyen depoları tanımlayın

bazel_dep ile diğer Bazel modüllerini temsil eden depolar tanımlayabilirsiniz. Bazen Bazel'i temsil etmeyen bir depo tanımlamanız gerekir. module; örneğin, veri olarak okunacak düz bir JSON dosyası içeren bir dosya.

Bu durumda, use_repo_rule yönergesini doğrudan tanımlamak için bunu yapabilirsiniz. Bu kod deposu yalnızca bulunduğu modül tarafından görülebilir tanımlanmalıdır.

Bu, temelde modülle aynı mekanizmayı uzantılarla depoları tanımlamanıza olanak sağlar. esnek olma.

Kod deposu adları ve katı depolar

Bir deponun görünen adı modülünün doğrudan bağımlıları için varsayılan olarak modül adına ayarlanır. bazel_dep özelliğinin repo_name özelliği yönergesi aksini söylüyor. Bunun, bir modülün yalnızca ilgili modülün doğrudan ve bildirmeyi konuştuk. Bu, geçişli bağımlılıkları ifade eder.

Bir deponun standart adı modülün mevcut olup olmadığına bağlı olarak module_name~version (örneğin, bazel_skylib~1.0.3) veya module_name~ (örneğin, bazel_features~) olmalıdır bağımlılık grafiğinin tamamında modülün birden fazla sürümünü kullanabilirsiniz ( multiple_version_override) tıklayın. Standart ad biçiminin kullanmanız gereken bir API olmadığını ve herhangi bir zamanda değiştirilebilir. Standart adı sabit kodlamak yerine, doğrudan Bazel'den almak için desteklenen bir yol kullanın: * BUILD ve .bzl dosyalarında şunu kullanın: Label örneğinde Label.repo_name kod deposunun görünür adı ile verilen bir etiket dizesinden oluşturulur (ör. Label("@bazel_skylib").repo_name * Çalıştırma dosyalarını ararken $(rlocationpath ...) kitaplıklardan birini @bazel_tools//tools/{bash,cpp,java}/runfiles veya rules_foo kural kümesi için, @rules_foo//foo/runfiles içinde. * IDE veya dil gibi harici bir araç üzerinden Bazel ile etkileşimde bulunurken sunucusu varsa eşlemeyi şuradan almak için bazel mod dump_repo_mapping komutunu kullanın: belirli bir depo kümesi için standart adlara giden görünür adlar.

Modül uzantıları, ek depolar da sunabilir görebilirsiniz.