Bazel'deki kilit dosyası özelliği, belirli sürümlerin veya bağımlılıklarını ifade eder. Google bunu, modül çözünürlüğünün ve genişletmenin sonucunu depolayarak değerlendirme. Kilit dosyası, yeniden oluşturulabilir derlemeleri teşvik ederek tutarlılık sağlar ortamları için değerlidir. Ayrıca, ekibinizin mümkün olan en yüksek değeri teslim edebilmesi Çözüm sürecinin değişikliklerden etkilenmeyen bölümlerini atlamak için Bazel önemli bir parçasıdır. Ayrıca kilit dosyası, kararlılığı beklenmedik güncellemeleri veya harici kitaplıklardaki değişiklikleri bozmayı önler. ve hata oluşması riskini azaltır.
Kilit Dosyası Oluşturma
Kilit dosyası, şu adla çalışma alanı kökü altında oluşturulur:
MODULE.bazel.lock
Derleme işlemi sırasında oluşturulur veya güncellenir.
özellikle de modül çözümleme ve uzantı değerlendirmesinden sonra. Daha da önemlisi,
yalnızca
seçeceğiz.
Projede bağımlılıklarını etkileyen değişiklikler gerçekleştiğinde kilit dosyası otomatik olarak güncellenir. Bu, kilit dosyasının mevcut iş modelinde ihtiyaç duyulan belirli bağımlılıklar ve projenin teslimatlarına dair doğru bir temsili ve bildirmeyi konuştuk.
Kilit Dosyası Kullanımı
Kilit dosyası, flag ile kontrol edilebilir
--lockfile_mode
-
proje durumu, başlangıç seviyesinden farklı olduğunda Bazel'in davranışını
kilit dosyası olarak gönderin. Kullanılabilir modlar şunlardır:
update
(Varsayılan): Kilit dosyasında bulunan bilgileri kullanarak şu işlemleri yapabilirsiniz: bilinen kayıt defteri dosyalarının indirilmesini atlamak ve uzantıların yeniden değerlendirilmesini önlemek için hâlâ güncel olan kullanıcılara ulaşabilirsiniz. Eksik bilgi varsa kilit dosyasına eklenmelidir. Bazel, bu modda sayfayı yenilemekten de kaçınır bağımlılığı ya da kaynaştırılmış bağımlılıklar için değiştirildi.refresh
:update
gibidir ancak değişken bilgiler her zaman ve bu moddayken neredeyse saat başı bu moda geçebilirsiniz.error
:update
gibi, ancak eksik veya güncel olmayan bilgiler varsa Bazel bir hatayla başarısız olur. Bu mod, kilit dosyasını veya çözüm sırasında ağ isteklerini yerine getirir. İşaretlenen modül uzantıları olduğundanreproducible
yine de ağ istekleri gerçekleştirebilir, ancak beklenen sonucu verir.off
: Kilit dosyası kontrol edilmez veya güncellenmez.
Kilit Dosyasının Avantajları
Kilit dosyası çeşitli avantajlar sunar ve çeşitli şekillerde kullanılabilir:
Tekrarlanabilir derlemeler. Belirli sürümleri veya bağımlılıkları yakalayarak kilit dosyası, derlemelerin yeniden üretilebilir olmasını sağlar. farklı ortamlarda ve zamanla. Geliştiriciler de tutarlı ve öngörülebilir sonuçlar elde etmesine yardımcı olur.
Hızlı artımlı çözünürlükler. Kilit dosyası, Bazel'in önceki bir derlemede kullanılan kayıt defteri dosyalarını indirme. Bu yöntem, özellikle de olasılıklı koşullarda satın alma işlemi çok zaman alabilir.
Kararlılık ve risk azaltma. Kilit dosyası, uygulamanın her zaman harici kitaplıklardaki değişiklikleri veya beklenmedik güncellemeleri önleme amaçlıdır. Ölçüt versiyonlara odaklanmak, hataya neden olma riski azaltılmış olması anlamına gelir.
Kilit Dosyası İçerikleri
Kilit dosyası, uygulamanızın ve projenin durumu değişti. Ayrıca projeyi inşa etme sürecinin sonucunu da durumuna getirin. Kilit dosyası iki ana bölümden oluşur:
- Modül çözünürlüğüne giriş olan tüm uzak dosyaların karmaları.
- Kilit dosyası, her modül uzantısını etkileyen girişler içerir ve
bzlTransitiveDigest
,usagesDigest
ve diğer alanlarla temsil edilir (örneğin, ve bu uzantıyı çalıştırmanın çıktısı,generatedRepoSpecs
Burada, kilit dosyasının yapısını her bölüm için açıklama:
{
"lockFileVersion": 10,
"registryFileHashes": {
"https://bcr.bazel.build/bazel_registry.json": "8a28e4af...5d5b3497",
"https://bcr.bazel.build/modules/foo/1.0/MODULE.bazel": "7cd0312e...5c96ace2",
"https://bcr.bazel.build/modules/foo/2.0/MODULE.bazel": "70390338... 9fc57589",
"https://bcr.bazel.build/modules/foo/2.0/source.json": "7e3a9adf...170d94ad",
"https://registry.mycorp.com/modules/foo/1.0/MODULE.bazel": "not found",
...
},
"selectedYankedVersions": {
"foo@2.0": "Yanked for demo purposes"
},
"moduleExtensions": {
"//:extension.bzl%lockfile_ext": {
"general": {
"bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
"usagesDigest": "aLmqbvowmHkkBPve05yyDNGN7oh7QE9kBADr3QIZTZs=",
...,
"generatedRepoSpecs": {
"hello": {
"bzlFile": "@@//:extension.bzl",
...
}
}
}
},
"//:extension.bzl%lockfile_ext2": {
"os:macos": {
"bzlTransitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
"usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
...,
"generatedRepoSpecs": {
"hello": {
"bzlFile": "@@//:extension.bzl",
...
}
}
},
"os:linux": {
"bzlTransitiveDigest": "eWDzxG/aLsyY3Ubrto....+Jp4maQvEPxn0pLK=",
"usagesDigest": "aLmqbvowmHkkBPve05y....yDNGN7oh7r3QIZTZs=",
...,
"generatedRepoSpecs": {
"hello": {
"bzlFile": "@@//:extension.bzl",
...
}
}
}
}
}
}
Kayıt Defteri Dosya Karmaları
registryFileHashes
bölümü,
modül çözümlemesi sırasında erişilen uzak kayıt defterleridir. Çözünürlükten bu yana
algoritmanın tamamen deterministik olduğunu, aynı girdiler ve tüm
Bu işlem, girişlere karma oluşturma işlemi uygulanır. Bu işlem, aynı zamanda
kilit dosyasında aşırı bilgilerin tekrarlanmasını önler. Lütfen
Bu işlem ayrıca, belirli bir kayıt defteri belirli bir
modülü mevcut, ancak daha düşük önceliğe sahip bir kayıt defterinde (ör. "not found" (bulunamadı)
bakın). Doğası gereği farklı olan bu bilgiler,
bazel mod deps --lockfile_mode=refresh
Bazel, depo önbelleğine alınır. Bu da sonraki kullanımları hızlandırır. belirler.
Seçilen Yanklanan Sürümler
selectedYankedVersions
bölümü, modüllerin yankedli sürümlerini içeriyor
seçilen ekran görüntüsüdür. Bu genellikle bir hata ile sonuçlandığı için
çalışırken, bu bölüm yalnızca yankedli sürümler kullanıldığında boş
--allow_yanked_versions
veya
BZLMOD_ALLOW_YANKED_VERSIONS
.
Modül dosyalarıyla karşılaştırıldığında, yanked sürüm bilgileri ile karşılaştırıldığında bu alan gereklidir
doğası gereği değişebilir ve bu nedenle karma ile referans gösterilemez. Bu bilgiler
bazel mod deps --lockfile_mode=refresh
üzerinden güncellenebilir.
Modül Uzantıları
moduleExtensions
bölümü, yalnızca kullanılan uzantıları içeren bir haritadır
veya daha önce çağrılmış olan (uzantılar hariç)
artık kullanılmıyor. Başka bir deyişle, uzantı kullanılmıyorsa
artık bağımlılık grafiğinde, moduleExtensions
haritası.
Bir uzantı, işletim sisteminden veya mimari türünden bağımsızsa Bu bölümde yalnızca tek bir "genel" girin. Aksi takdirde OS, mimari veya her ikisinden de adlandırılmış, ilgili uzantılara göre değerlendirmenin sonucuna karşılık gelir.
Uzantı haritasındaki her giriş, kullanılan bir uzantıya karşılık gelir ve tarafından tanımlanan dosya ve adla tanımlanır. Her bir öğe için karşılık gelen girişi, söz konusu uzantıyla alakalı bilgileri içeriyorsa:
bzlTransitiveDigest
, uzantı uygulamasının özetidir ve geçişli olarak yüklenen .bzl dosyalarını kapsar.usagesDigest
, uzantının ve tüm etiketleri içeren bağımlılık grafiğidir.- Uzantıya yapılan diğer girişleri izleyen, belirtilmemiş diğer alanlar okuduğu dosyaların veya dizinlerin içeriği ya da ortam değişkenlerine odaklanacağız.
generatedRepoSpecs
, uzantısını kullanabilirsiniz.- İsteğe bağlı
moduleExtensionMetadata
alanı, Örneğin, uzantıya izin verilen belirli bir depo kök modül tarafındanuse_repo
aracılığıyla içe aktarıldı. Bu bilgilerbazel mod tidy
komutudur.
Modül uzantıları,
reproducible = True
ile meta verileri döndürüyor. Bu sayede, kendilerine sunulan
aynı girişlere sahip olduklarında her zaman aynı depoları oluştururlar.
En İyi Uygulamalar
Kilit dosyası özelliğinin avantajlarından en iyi şekilde yararlanmak için aşağıdakileri en iyi şekilde değerlendirin: uygulamalar:
Kilit dosyasını proje bağımlılıklarındaki değişiklikleri yansıtacak şekilde düzenli olarak güncelleyin. yapılandırma. Bu, sonraki derlemelerin en önemli güncel ve doğru bir bağımlılık dizisi oluşturmanız gerekir. Tüm uzantıları kilitlemek için aynı anda
bazel mod deps --lockfile_mode=update
çalıştırın.Ortak çalışmayı kolaylaştırmak için kilit dosyasını sürüm kontrolüne dahil edin tüm ekip üyelerinin aynı kilit dosyasına erişmesini sağlayarak tutarlı geliştirme ortamları belirlemenize yardımcı olur.
Bazel'i çalıştırmak için
bazelisk
işlevini kullanın ve bir Sürüm kontrolünde Bazel sürümünü belirten.bazelversion
dosyası kilit dosyasına karşılık gelir. Çünkü Bazel'in kendisi kilit dosyası Bazel sürümüne özgüdür ve her bir geriye dönük uyumluluğa sahip olsalar da Bazel sürümleri.bazelisk
kullanmak, tüm geliştiricilerin kilit dosyasıyla eşleşen bir Bazel sürümü bulunmalıdır.
Bu en iyi uygulamaları izleyerek kilit dosyasını etkili bir şekilde Bu da daha verimli, güvenilir ve iş birliğine olanak tanıyan iş akışlarıyla başlayalım.
Çakışmaları Birleştir
Kilit dosyası biçimi, birleştirme çakışmalarını en aza indirmek için tasarlanmıştır ancak olur.
Otomatik Çözünürlük
Bazel, özel bir URL'yi git birleştirme sürücüsü otomatik olarak çözüme kavuşturulabilir.
Bu satırı.gitattributes
git deponuz:
# A custom merge driver for the Bazel lockfile.
# https://bazel.build/external/lockfile#automatic-resolution
MODULE.bazel.lock merge=bazel-lockfile-merge
Daha sonra, sürücüyü kullanmak isteyen her geliştiricinin sürücüyü bir kez şu adımları uygulayarak:
- jq'yi (1.5 veya sonraki bir sürüm) yükleyin.
- Aşağıdaki komutları çalıştırın:
jq_script=$(curl https://raw.githubusercontent.com/bazelbuild/bazel/master/scripts/bazel-lockfile-merge.jq)
printf '%s\n' "${jq_script}" | less # to optionally inspect the jq script
git config --global merge.bazel-lockfile-merge.name "Merge driver for the Bazel lockfile (MODULE.bazel.lock)"
git config --global merge.bazel-lockfile-merge.driver "jq -s '${jq_script}' -- %O %A %B > %A.jq_tmp && mv %A.jq_tmp %A"
Manuel Çözüm
registryFileHashes
ve selectedYankedVersions
içinde basit birleştirme çakışmaları
güvenli bir şekilde çözülebilir. Bu işlemde, her iki taraftan da tüm girişler korunarak
çatışmaya neden olabilir.
Diğer birleştirme çakışması türleri manuel olarak çözümlenmemelidir. Bunun yerine:
- Kilit dosyasının önceki durumunu geri yükle
git reset MODULE.bazel.lock && git checkout MODULE.bazel.lock
üzerinden. MODULE.bazel
dosyasındaki çakışmaları giderin.- Kilit dosyasını güncellemek için
bazel mod deps
komutunu çalıştırın.