Bazel'deki kilit dosyası özelliği, bir proje için gereken yazılım kitaplıklarının veya paketlerin belirli sürümlerinin ya da bağımlılıklarının kaydedilmesini sağlar. Bu, modül çözünürlüğünün ve uzantı değerlendirmesinin sonucunu depolayarak sağlanır. Kilit dosyası, tutarlı geliştirme ortamları sağlayarak tekrarlanabilir derlemeleri destekler. Ayrıca, projede bağımlılıklarla ilgili değişiklik olmadığında Bazel'in çözümleme sürecini atlamasına izin vererek derleme verimliliğini artırır. Ayrıca, kilit dosyası harici kitaplıklarda beklenmedik güncellemeleri veya zarar veren değişiklikleri önleyerek kararlılığı artırır ve böylece hataların ortaya çıkma riskini azaltır.
Kilit dosyası oluşturma
Kilit dosyası, çalışma alanı kökünde MODULE.bazel.lock
adıyla oluşturulur. Derleme işlemi sırasında, özellikle modül çözümü ve uzantı değerlendirmesinden sonra oluşturulur veya güncellenir. Kilit dosyası, MODULE dosyası, işaretler, geçersiz kılmalar ve diğer ilgili bilgiler de dahil olmak üzere projenin mevcut durumunu yakalar. Önemli olarak, yalnızca derlemenin geçerli çağrılmasına dahil edilen bağımlılıkları içerir.
Projede bağımlılıklarını etkileyen değişiklikler olduğunda, kilit dosyası yeni durumu yansıtacak şekilde otomatik olarak güncellenir. Bu sayede, kilit dosyası mevcut derleme için gereken belirli bağımlılıklar kümesine odaklanmaya devam eder ve projenin çözümlenmiş bağımlılıklarını doğru bir şekilde temsil eder.
Lockfile Kullanımı
Proje durumu kilit dosyasından farklı olduğunda Bazel'in davranışını özelleştirmek için kilit dosyası --lockfile_mode
işaretiyle kontrol edilebilir. Kullanılabilir modlar şunlardır:
update
(Varsayılan): Proje durumu kilit dosyasıyla eşleşiyorsa çözüm sonucu hemen kilit dosyasından döndürülür. Aksi takdirde, çözümleme yürütülür ve kilit dosyası mevcut durumu yansıtacak şekilde güncellenir.error
: Proje durumu, kilit dosyasıyla eşleşiyorsa çözüm sonucu kilit dosyasından döndürülür. Aksi takdirde Bazel, proje ile kilit dosyası arasındaki farklılıkları belirten bir hata verir. Bu mod, özellikle projenizin bağımlılıklarının değişmeden kalmasını ve farklılıkların hata olarak değerlendirilmesini istediğinizde yararlıdır.off
: Kilit dosyası hiç kontrol edilmez.
Lockfile'ın avantajları
Kilit dosyası çeşitli avantajlar sunar ve farklı şekillerde kullanılabilir:
Yeniden üretilebilir derlemeler. Kilit dosyası, yazılım kitaplıklarının belirli sürümlerini veya bağımlılıklarını yakalayarak derlemelerin farklı ortamlarda ve zaman içinde yeniden üretilebilir olmasını sağlar. Geliştiriciler, projelerini oluştururken tutarlı ve öngörülebilir sonuçlar elde edebilir.
Verimli çözünürlük atlama. Kilit dosyası, son derlemeden bu yana proje bağımlılıklarında değişiklik olmaması durumunda Bazel'in çözümleme sürecini atlamasını sağlar. Bu, özellikle çözünürlüğün zaman alabileceği senaryolarda derleme verimliliğini önemli ölçüde artırır.
Kararlılık ve risk azaltma. Kilit dosyası, harici kitaplıklarda beklenmedik güncellemeleri veya önemli değişiklikleri önleyerek kararlılığın korunmasına yardımcı olur. Bağımlılıkları belirli sürümlere kilitleyerek uyumsuz veya test edilmemiş güncellemelerden kaynaklanan hataların ortaya çıkma riski azaltılır.
Lockfile İçeriği
Kilit dosyası, proje durumunun değişip değişmediğini belirlemek için gerekli tüm bilgileri içerir. Ayrıca, projenin mevcut durumdaki halinin oluşturulmasıyla ilgili sonuç da yer alır. Kilit dosyası iki ana bölümden oluşur:
- Modül çözünürlüğünün girişleri (ör.
moduleFileHash
,flags
velocalOverrideHashes
) ve çözünürlüğün çıkışı (moduleDepGraph
). - Her modül uzantısı için kilit dosyası, uzantıyı etkileyen girişleri (
transitiveDigest
ile gösterilir) ve uzantının çalıştırılmasının sonucunu (generatedRepoSpecs
olarak adlandırılır) içerir.
Aşağıda, kilit dosyasının yapısını gösteren bir örnek ve her bölümle ilgili açıklamalar verilmiştir:
{
"lockFileVersion": 1,
"moduleFileHash": "b0f47b98a67ee15f9.......8dff8721c66b721e370",
"flags": {
"cmdRegistries": [
"https://bcr.bazel.build/"
],
"cmdModuleOverrides": {},
"allowedYankedVersions": [],
"envVarAllowedYankedVersions": "",
"ignoreDevDependency": false,
"directDependenciesMode": "WARNING",
"compatibilityMode": "ERROR"
},
"localOverrideHashes": {
"bazel_tools": "b5ae1fa37632140aff8.......15c6fe84a1231d6af9"
},
"moduleDepGraph": {
"<root>": {
"name": "",
"version": "",
"executionPlatformsToRegister": [],
"toolchainsToRegister": [],
"extensionUsages": [
{
"extensionBzlFile": "extension.bzl",
"extensionName": "lockfile_ext"
}
],
...
}
},
"moduleExtensions": {
"//:extension.bzl%lockfile_ext": {
"transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
"generatedRepoSpecs": {
"hello": {
"bzlFile": "@@//:extension.bzl",
...
}
}
}
}
}
Modül Dosyası Karma Değeri
moduleFileHash
, MODULE.bazel
dosya içeriklerinin karma değerini temsil eder. Bu dosyada herhangi bir değişiklik olursa karma değeri farklı olur.
Bayraklar
Flags
nesnesi, çözüm sonucunu etkileyebilecek tüm işaretleri depolar.
Yerel Geçersiz Kılma Karma Değerleri
Kök modül local_path_overrides
içeriyorsa bu bölümde MODULE.bazel
dosyasının karma değeri yerel depoda saklanır. Bu bağımlılıkta yapılan değişikliklerin izlenmesine olanak tanır.
Modül Bağımlılığı Grafiği
moduleDepGraph
, yukarıda belirtilen girişler kullanılarak çözünürlük sürecinin sonucunu gösterir. Projenin çalıştırılması için gereken tüm modüllerin bağımlılık grafiğini oluşturur.
Modül Uzantıları
moduleExtensions
bölümü, yalnızca mevcut çağrıda veya daha önce çağrılan uzantıları içeren, artık kullanılmayan uzantıları ise hariç tutan bir haritadır. Diğer bir deyişle, bir uzantı bağımlılık grafiğinde artık kullanılmıyorsa moduleExtensions
haritasından kaldırılır.
Bu haritadaki her giriş, kullanılan bir uzantıya karşılık gelir ve bulunduğu dosya ile adı kullanılarak tanımlanır. Her girişin karşılık gelen değeri, ilgili uzantıyla ilişkili bilgileri içerir:
- Uzantı uygulamasının ve geçişli .bzl dosyalarının
transitiveDigest
özeti. generatedRepoSpecs
, bu uzantının mevcut girişle çalıştırılmasının sonucudur.
Uzantı sonuçlarını etkileyebilecek bir diğer faktör de kullanımlarıdır. Kullanımlar, kilit dosyasında depolanmamasına rağmen uzantının mevcut durumu ile kilit dosyasındaki durumu karşılaştırılırken dikkate alınır.
En İyi Uygulamalar
Kilit dosyası özelliğinin avantajlarından en iyi şekilde yararlanmak için aşağıdaki en iyi uygulamaları göz önünde bulundurun:
Proje bağımlılıklarındaki veya yapılandırmadaki değişiklikleri yansıtmak için kilit dosyasını düzenli olarak güncelleyin. Bu sayede, sonraki derlemelerin en güncel ve doğru bağımlılıklar kümesine dayalı olması sağlanır.
Ortak çalışmayı kolaylaştırmak ve tüm ekip üyelerinin aynı kilit dosyasına erişmesini sağlamak için kilit dosyasını sürüm kontrolüne ekleyin. Böylece proje genelinde tutarlı geliştirme ortamları sağlanır.
Bu en iyi uygulamaları izleyerek Bazel'deki kilit dosyası özelliğini etkili bir şekilde kullanabilir, böylece daha verimli, güvenilir ve işbirlikçi yazılım geliştirme iş akışları oluşturabilirsiniz.