Bazel Kilit Dosyası

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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ğundan reproducible 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:

  1. Modül çözünürlüğüne giriş olan tüm uzak dosyaların karmaları.
  2. 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:

  1. bzlTransitiveDigest, uzantı uygulamasının özetidir ve geçişli olarak yüklenen .bzl dosyalarını kapsar.
  2. usagesDigest, uzantının ve tüm etiketleri içeren bağımlılık grafiğidir.
  3. 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.
  4. generatedRepoSpecs, uzantısını kullanabilirsiniz.
  5. İsteğe bağlı moduleExtensionMetadata alanı, Örneğin, uzantıya izin verilen belirli bir depo kök modül tarafından use_repo aracılığıyla içe aktarıldı. Bu bilgiler bazel 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:

  1. jq'yi (1.5 veya sonraki bir sürüm) yükleyin.
  2. 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:

  1. Kilit dosyasının önceki durumunu geri yükle git reset MODULE.bazel.lock && git checkout MODULE.bazel.lock üzerinden.
  2. MODULE.bazel dosyasındaki çakışmaları giderin.
  3. Kilit dosyasını güncellemek için bazel mod deps komutunu çalıştırın.