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ünü ya da
--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 bağımlılık grafiğinde 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, izin verilen en yakın sürüme aynı anda uyumluluk düzeyiyle belirlenir. Aynı uyumlulukta izin verilen daha yüksek bir sürüm yoksa bir hata mesajı verir.
Örneğin,1.1
1.3
1.5
1.7
2.0
bağımlılık grafiğini görebilirsiniz. Ana sürüm ise, çözüldüğünde
seviye:
1.3
,1.7
ve2.0
sonuçlarına izin veren birden çok sürüm geçersiz kılması1.1
sürüm1.3
,1.5
sürüm ise1.7
sürümüne yükseltiliyor ve diğer kullanıcılar sürümü aynı kaldı.1.5
ve2.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
ve2.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ğinde1.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
için de geçerli.
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 ...)
veya çalıştırılacak dosyalardan 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.