Bazel Kilit Dosyası

Sorun bildir Kaynağı göster

Bazel'deki kilitli dosya özelliği, bir projenin gerektirdiği belirli sürümlerin ya da yazılım kitaplıklarının veya paketlerin bağımlılıklarının kaydedilmesini sağlar. Bunu, modül çözünürlüğü ve uzantı değerlendirmesinin sonucunu depolayarak yapar. Kilit dosyası, yeniden oluşturulabilir derlemeleri teşvik ederek tutarlı geliştirme ortamları sağlar. Ayrıca, proje bağımlılıklarında herhangi bir değişiklik olmadığında Bazel'ın çözüm sürecini atlamasına olanak tanıyarak derleme verimliliğini artırır. Ayrıca kilit dosyası, beklenmedik güncellemeleri önleyerek veya harici kitaplıklardaki değişiklikleri bozarak kararlılığı iyileştirir, böylece hata oluşması riskini azaltır.

Kilitli Dosya Oluşturma

Kilit dosyası, çalışma alanı kök dizininde MODULE.bazel.lock adıyla oluşturulur. Özellikle modül çözümlemesi ve uzantı değerlendirmesi sonrasında, derleme sürecinde oluşturulur veya güncellenir. Kilit dosyası; MODULE dosyası, işaretler, geçersiz kılmalar ve diğer ilgili bilgiler dahil olmak üzere projenin mevcut durumunu yakalar. Önemli bir nokta, yalnızca derlemenin geçerli çağrısına dahil olan bağımlılıkları içerir.

Projede bağımlılıklarını etkileyen değişiklikler meydana geldiğinde kilit dosyası, yeni durumu yansıtacak şekilde otomatik olarak güncellenir. Bu, kilitli dosyanın mevcut derleme için gereken belirli bağımlılık grubuna odaklanmasını sağlayarak projenin çözülmüş bağımlılıklarının doğru bir temsilini sağlar.

Kilitli Dosya Kullanımı

Kilit dosyası, proje durumu kilit dosyasından farklı olduğunda Bazel'ın davranışını özelleştirmek için işaret --lockfile_mode ile kontrol edilebilir. Kullanılabilir modlar şunlardır:

  • update (Varsayılan): Proje durumu kilit dosyasıyla eşleşirse kilit dosyasından hemen çözümleme sonucu döndürülür. Aksi takdirde, çözünürlük yürütülür ve kilit dosyası mevcut durumu yansıtacak şekilde güncellenir.
  • error: Proje durumu kilit dosyasıyla eşleşirse kilit dosyasından çözüm sonucu döndürülür. Aksi takdirde, Bazel proje ve kilit dosyası arasındaki varyasyonları 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 sağlamak istediğiniz durumlarda kullanışlıdır.
  • off: Kilit dosyası hiç kontrol edilmedi.

Kilitli Dosya Avantajları

Kilit dosyası, birçok avantaj sunar ve çeşitli şekillerde kullanılabilir:

  • Yeniden oluşturulabilir 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 oluşturulabilmesini sağlar. Geliştiriciler projelerini oluştururken tutarlı ve tahmin edilebilir sonuçlara güvenebilirler.

  • Etkili çözünürlük atlama. Kilit dosyası, son derlemeden bu yana proje bağımlılıklarında herhangi bir değişiklik olmadıysa Bazel'in çözüm sürecini atlamasını sağlar. Bu, özellikle de çözümün zaman alıcı olabileceği senaryolarda derleme verimliliğini önemli ölçüde artırır.

  • Kararlılık ve risk azaltma. Kilit dosyası, beklenmedik güncellemeleri önleyerek veya harici kitaplıklardaki değişiklikleri bozarak kararlılığın sürdürülmesine yardımcı olur. Bağımlılıkları belirli sürümlere kilitlediğinizde, uyumsuz veya test edilmemiş güncellemeler nedeniyle hata oluşması riski azalır.

Kilitli Dosya İçeriği

Kilit dosyası, projenin durumunun değişip değişmediğini belirlemek için gereken tüm bilgileri içerir. Ayrıca projeyi mevcut durumda oluşturmanın sonucunu içerir. Kilit dosyası iki ana bölümden oluşur:

  1. Modül çözünürlüğündeki moduleFileHash, flags ve localOverrideHashes gibi girişler ve moduleDepGraph olan çözünürlük çıkışı.
  2. Kilit dosyası, her modül uzantısı için onu etkileyen girişleri ve transitiveDigest ile temsil edilen girişleri ve bu uzantıyı çalıştırmanın çıkışını (generatedRepoSpecs) içerir.

Burada, kilit dosyasının yapısını ve her bir bölümün açıklamalarını gösteren bir örnek bulunmaktadır:

{
  "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": {
      "general": {
        "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    },
    "//:extension.bzl%lockfile_ext2": {
      "os:macos": {
        "transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      },
      "os:linux": {
        "transitiveDigest": "eWDzxG/aLsyY3Ubrto....+Jp4maQvEPxn0pLK=",
        "generatedRepoSpecs": {
          "hello": {
            "bzlFile": "@@//:extension.bzl",
            ...
          }
        }
      }
    }
  }
}

Modül Dosyası Karma Değeri

moduleFileHash, MODULE.bazel dosya içeriğinin karmasını gösterir. Bu dosyada herhangi bir değişiklik olursa karma değeri değişiklik gösterir.

Bayraklar

Flags nesnesi, çözünürlük sonucunu etkileyebilecek tüm işaretleri depolar.

Yerel Geçersiz Kılma Karmaları

Kök modülde local_path_overrides bulunuyorsa bu bölümde MODULE.bazel dosyasının karma değeri yerel depoda depolanır. Bu bağımlılıktaki değişikliklerin izlemesini sağlar.

Modül Bağımlılık Grafiği

moduleDepGraph, yukarıda belirtilen girişler kullanılarak çözüm sürecinin sonucunu temsil eder. Projeyi yürütmek için gereken tüm modüllerin bağımlılık grafiğini oluşturur.

Modül Uzantıları

moduleExtensions bölümü, artık kullanılmayan uzantıları hariç tutarken, yalnızca geçerli çağrıda kullanılan veya daha önce çağrılan uzantıları içeren bir haritadır. Başka bir deyişle, bağımlılık grafiğinde artık kullanılmayan bir uzantı moduleExtensions haritasından çıkarılır.

Bir uzantı, işletim sisteminden veya mimari türünden bağımsızsa bu bölümde yalnızca tek bir "genel" giriş bulunur. Aksi takdirde, birden fazla giriş dahil edilir ve işletim sistemi, mimari veya her ikisi birden adlandırılmış olur ve her biri, uzantının bu özellikler açısından değerlendirilmesinin sonucuna karşılık gelir.

Uzantı haritasındaki her giriş, kullanılan bir uzantıya karşılık gelir ve içerdiği dosya ve adla tanımlanır. Her girişin karşılık gelen değeri, söz konusu uzantıyla ilişkili bilgileri içerir:

  1. transitiveDigest, uzantı uygulamasının ve geçişli .bzl dosyalarının özetidir.
  2. Bu uzantının geçerli girişle çalıştırılmasından kaynaklanan generatedRepoSpecs.

Uzantı sonuçlarını etkileyebilecek diğer bir faktör de kullanımlarıdır. Kilit dosyasında depolanmasa bile, uzantının geçerli durumu kilit dosyasındakiyle karşılaştırılırken kullanımlar dikkate alınır.

En iyi uygulamalar

Kilitli dosya özelliğinin avantajlarını en üst düzeye çıkarmak için aşağıdaki en iyi uygulamaları göz önünde bulundurun:

  • Kilit dosyasını proje bağımlılıkları veya yapılandırmadaki değişiklikleri yansıtacak şekilde düzenli olarak güncelleyin. Bu, sonraki derlemelerin en güncel ve doğru bağımlılık grubuna dayalı olmasını sağlar.

  • Ortak çalışmayı kolaylaştırmak için kilit dosyasını sürüm denetimine dahil edin ve tüm ekip üyelerinin aynı kilitli dosyaya erişebildiğinden emin olun. Böylece, proje genelinde tutarlı geliştirme ortamları desteklenir.

  • Bazel'ı çalıştırmak için bazelisk aracını kullanın ve sürüm denetimine, kilit dosyasına karşılık gelen Bazel sürümünü belirten bir .bazelversion dosyası ekleyin. Bazel'ın kendisi derlemenizin bir bağımlılığı olduğundan, kilit dosyası Bazel sürümüne özeldir ve geriye dönük uyumlu Bazel sürümleri arasında bile değişir. bazelisk kullanılması, tüm geliştiricilerin kilit dosyasıyla eşleşen bir Bazel sürümü kullanmasını sağlar.

Bu en iyi uygulamaları izleyerek Bazel'deki kilitli dosya özelliğinden etkili bir şekilde yararlanabilir, böylece daha verimli, güvenilir ve iş birliğine dayalı yazılım geliştirme iş akışları elde edebilirsiniz.