Bazel Kilit Dosyası

Sorun bildirin Kaynağı göster

Bazel'deki kilit dosyası özelliği, bir projenin gerektirdiği yazılım kitaplıklarının veya paketlerin belirli sürümlerinin ya da 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, Bazel'ın çözüm sürecinin proje bağımlılıklarındaki değişikliklerden etkilenmeyen kısımları atlamasına olanak tanıyarak yapı verimliliğini de artırır. Ayrıca kilit dosyası, beklenmedik güncellemeleri önleyerek veya harici kitaplıklarda değişiklikleri bozarak kararlılığı iyileştirir ve böylece hata oluşması riskini azaltır.

Kilit Dosyası Oluşturma

Kilit dosyası, MODULE.bazel.lock adlı çalışma alanı kökü altında oluşturulur. Derleme işlemi sırasında, özellikle de modül çözümlemesi ve uzantı değerlendirmesinden sonra oluşturulur veya güncellenir. Daha da önemlisi, yalnızca derlemenin mevcut çağrısı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, kilit dosyasının mevcut derleme için gereken belirli bağımlılıklar kümesine odaklanmasını ve projenin çözülmüş bağımlılıklarını doğru bir şekilde göstermesini sağlar.

Kilit Dosyası Kullanımı

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

  • update (Varsayılan): Bilinen kayıt defteri dosyalarının indirilmesini atlamak ve sonuçları hâlâ güncel olan uzantıları yeniden değerlendirmekten kaçınmak için kilit dosyasında bulunan bilgileri kullanın. Eksik bilgi varsa kilit dosyasına eklenir. Bu modda Bazel, değişmemiş bağımlılıklar için yanked sürümler gibi değişken bilgilerin yenilenmesini de önler.
  • refresh: update gibi, ancak bu moda geçiş yapıldığında değişken bilgiler her zaman ve bu moddayken yaklaşık olarak saatte bir yenilenir.
  • error: update gibi, ancak herhangi bir bilgi eksik veya güncel değilse Bazel bir hatayla başarısız olur. Bu mod, kilit dosyasını hiçbir zaman değiştirmez veya çözüm sırasında ağ istekleri gerçekleştirmez. Kendilerini reproducible olarak işaretleyen modül uzantıları, ağ isteklerini yerine getirmeye devam edebilir, ancak her zaman aynı sonucu üretmeleri beklenir.
  • 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. 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 üretilmesini sağlar. Geliştiriciler projelerini oluştururken tutarlı ve öngörülebilir sonuçlara güvenebilirler.

  • Hızlı artımlı çözünürlükler. Kilit dosyası, Bazel'in önceki bir derlemede kullanılmış olan kayıt defteri dosyalarını indirmesini önler. Bu, özellikle çö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ı, beklenmeyen güncellemeleri önleyerek veya harici kitaplıklarda değişiklikleri bozarak kararlılığı korumaya yardımcı olur. Bağımlılıkları belirli sürümlere kilitleyerek, uyumsuz veya test edilmemiş güncellemelerden kaynaklanan hata oluşması riskini azaltır.

Kilit Dosyası İçerikleri

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

  1. Modül çözünürlüğü girişi olan tüm uzak dosyaların karmaları.
  2. Kilit dosyası, her bir modül uzantısı için onu etkileyen girişleri (bzlTransitiveDigest, usagesDigest ve diğer alanlarla temsil edilen) ve bu uzantıyı çalıştırmanın çıkışını (generatedRepoSpecs olarak adlandırılır) içerir

Aşağıda, kilit dosyasının yapısını ve her bir bölüm için açıklamaları gösteren bir örnek verilmiştir:

{
  "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 Dosyası Karmaları

registryFileHashes bölümü, modül çözümlemesi sırasında erişilen uzaktan kayıt defterlerindeki tüm dosyaların karmalarını içerir. Aynı girişler sağlandığında ve tüm uzak girişlere karma oluşturma işlemi uygulandığında çözüm algoritması tamamen deterministik olduğundan bu, kilit dosyasında uzak bilgilerin aşırı tekrarlanmasını önlerken tamamen yeniden üretilebilir bir çözüm sonucu sağlar. Bu işlemin, belirli bir kayıt defterinin belirli bir modülü içermediği ancak daha düşük önceliğe sahip bir kayıt defteri içermesi durumunda da kayıt gerektirdiğini unutmayın (örnekteki "bulunamadı" girişine bakın). Doğası gereği farklı olan bu bilgiler bazel mod deps --lockfile_mode=refresh aracılığıyla güncellenebilir.

Bazel, indirmeden önce depo önbelleğinde kayıt defteri dosyalarını aramak için kilit dosyasındaki karmaları kullanır. Bu da sonraki çözümlemeleri hızlandırır.

Seçilen Yanklanan Sürümler

selectedYankedVersions bölümü, modül çözünürlüğü tarafından seçilen modüllerin yankılanmış sürümlerini içerir. Bu durum, derleme sırasında genellikle bir hatayla sonuçlandığından yalnızca yankılanan sürümlere --allow_yanked_versions veya BZLMOD_ALLOW_YANKED_VERSIONS aracılığıyla açıkça izin verildiğinde bu bölüm boş bırakılamaz.

Modül dosyalarıyla karşılaştırıldığında yankı uygulanmış sürüm bilgileri doğası gereği değişebildiğinden ve bu nedenle karma tarafından referans gösterilemediğinden bu alan gereklidir. Bu bilgiler bazel mod deps --lockfile_mode=refresh üzerinden güncellenebilir.

Modül Uzantıları

moduleExtensions bölümü, yalnızca mevcut çağrıda kullanılan veya daha önce çağrılan uzantıları içeren bir haritadır ancak artık kullanılmayan uzantıları hariç tutar. Başka bir deyişle, bağımlılık grafiğinde artık kullanılmayan uzantılar moduleExtensions haritasından kaldırı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, her biri uzantının söz konusu özelliklerle ilgili değerlendirilmesinin sonucuna karşılık gelen, işletim sisteminden, mimariden veya her ikisinden sonra adlandırılmış birden fazla giriş dahil edilir.

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

  1. bzlTransitiveDigest, uzantı uygulamasının ve geçişli olarak yüklenen .bzl dosyalarının özetidir.
  2. usagesDigest, tüm etiketleri içeren bağımlılık grafiğindeki uzantı kullanımlarının özetidir.
  3. Uzantının okuduğu dosyaların veya dizinlerin içeriği ya da kullandığı ortam değişkenleri gibi diğer girişleri izleyen, belirtilmemiş diğer alanlar.
  4. generatedRepoSpecs, uzantı tarafından oluşturulan depoları geçerli girişle kodlar.
  5. İsteğe bağlı moduleExtensionMetadata alanı, uzantının sağladığı meta verileri (ör. oluşturduğu belirli depoların kök modül tarafından use_repo aracılığıyla içe aktarılıp aktarılmayacağı) içerir. Bu bilgiler bazel mod tidy komutunu destekler.

Modül uzantıları, döndürülen meta verileri reproducible = True ile ayarlayarak kilit dosyasına dahil edilmeyi devre dışı bırakabilir. Böylece, aynı girişlerle her zaman aynı depoları oluşturacaklarını taahhüt ederler.

En iyi uygulamalar

Kilit dosyası ö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ındaki veya yapılandırmadaki değişiklikleri yansıtacak şekilde düzenli olarak güncelleyin. Bu, sonraki derlemelerin en güncel ve en doğru bağımlılık grubuna dayanmasını sağlar. Tüm uzantıları tek seferde kilitlemek için bazel mod deps --lockfile_mode=update komutunu çalıştırın.

  • İş birliğini 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 dahil ederek proje genelinde tutarlı geliştirme ortamları oluşturun.

  • Bazel'i ç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'in kendisi derlemenize bir bağımlılık olduğundan, kilit dosyası Bazel sürümüne özgüdür 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 kilit dosyası özelliğini etkili bir şekilde kullanarak daha verimli, güvenilir ve ortak çalışmaya dayalı yazılım geliştirme iş akışları elde edebilirsiniz.