Lockfile Bazel

Laporkan masalah Lihat sumber Per Malam · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Fitur {i>lockfile<i} di Bazel memungkinkan perekaman versi atau dependensi pustaka atau paket perangkat lunak yang dibutuhkan oleh sebuah proyek. Ini mencapai hal ini dengan menyimpan hasil resolusi modul dan ekstensi evaluasi. Lockfile mendukung build yang dapat direproduksi, memastikan konsistensi lingkungan pengembangan lainnya. Selain itu, meningkatkan efisiensi build dengan Bazel untuk melewati proses resolusi ketika tidak ada perubahan dalam project dependensi. Selanjutnya, {i>lockfile<i} meningkatkan stabilitas dengan mencegah pembaruan yang tidak terduga atau perubahan yang dapat menyebabkan gangguan di {i>library<i} eksternal, sehingga mengurangi risiko memperkenalkan {i>bug<i}.

Pembuatan Lockfile

Lockfile dibuat di bawah root ruang kerja dengan nama MODULE.bazel.lock. Instance dibuat atau diperbarui selama proses build, khususnya setelah resolusi modul dan evaluasi ekstensi. Lockfile menangkap status proyek saat ini, termasuk {i>file<i} MODULE, penanda, dan informasi relevan lainnya. Yang penting, ini hanya mencakup dependensi yang disertakan dalam pemanggilan build saat ini.

Ketika terjadi perubahan dalam proyek yang mempengaruhi dependensinya, {i>lockfile<i} akan diperbarui secara otomatis untuk mencerminkan status baru. Hal ini memastikan bahwa {i>lockfile<i} tetap fokus pada serangkaian dependensi tertentu yang dibutuhkan oleh lingkungan membangun solusi, sehingga memberikan representasi akurat dari penyelesaian proyek dependensi.

Penggunaan Lockfile

{i>lockfile<i} dapat dikontrol oleh penanda --lockfile_mode ke menyesuaikan perilaku Bazel saat status project berbeda dari {i>lockfile<i}. Mode yang tersedia adalah:

  • update (Default): Jika status project cocok dengan lockfile, hasil resolusi akan segera ditampilkan dari {i>lockfile<i}. Jika tidak, dieksekusi, dan {i>lockfile<i} akan diperbarui untuk mencerminkan kondisi status.
  • error: Jika status project cocok dengan lockfile, hasil resolusinya adalah yang dikembalikan dari {i>lockfile<i}. Jika tidak, Bazel akan menampilkan {i>error<i} yang menunjukkan variasi antara proyek dan {i>lockfile<i}. Mode ini terutama berguna ketika Anda ingin memastikan bahwa dependensi proyek Anda tetap tidak berubah, dan selisih apa pun dianggap sebagai error.
  • off: Lockfile tidak diperiksa sama sekali.

Manfaat Lockfile

Lockfile ini menawarkan beberapa manfaat dan dapat digunakan dengan berbagai cara:

  • Build yang dapat direproduksi. Dengan merekam versi atau dependensi tertentu library perangkat lunak, {i>lockfile<i} memastikan bahwa build dapat direproduksi di berbagai lingkungan dan dari waktu ke waktu. Developer dapat mengandalkan hasil yang konsisten dan dapat diprediksi ketika membangun proyek mereka.

  • Pelewatan resolusi yang efisien. {i>Lockfile<i} memungkinkan Bazel untuk melewati proses resolusi jika tidak ada perubahan dalam dependensi proyek karena build terakhir. Hal ini meningkatkan efisiensi build secara signifikan, terutama dalam skenario di mana penyelesaian dapat memakan waktu.

  • Stabilitas dan pengurangan risiko. Lockfile membantu menjaga stabilitas dengan mencegah pembaruan yang tidak terduga atau perubahan yang dapat menyebabkan gangguan di pustaka eksternal. Menurut mengunci dependensi ke versi tertentu, risiko menimbulkan {i>bug<i} karena update yang tidak kompatibel atau tidak diuji berkurang.

Konten Lockfile

Lockfile berisi semua informasi yang dibutuhkan untuk menentukan apakah status project telah berubah. Hal ini juga mencakup hasil dari pembangunan proyek dengan kondisi saat ini. Lockfile terdiri dari dua bagian utama:

  1. Input resolusi modul, seperti moduleFileHash, flags, dan localOverrideHashes, serta output resolusinya moduleDepGraph.
  2. Untuk setiap ekstensi modul, {i>lockfile<i} menyertakan input yang memengaruhinya, yang direpresentasikan oleh transitiveDigest, dan output menjalankan ekstensi tersebut disebut sebagai generatedRepoSpecs

Berikut adalah contoh yang menunjukkan struktur {i>lockfile<i}, bersama dengan penjelasan untuk setiap bagian:

{
  "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",
          ...
        }
      }
    }
  }
}

Hash File Modul

moduleFileHash mewakili hash konten file MODULE.bazel. Jika terjadi perubahan dalam file ini, nilai {i>hash<i} akan berbeda.

Flag

Objek Flags menyimpan semua tanda yang dapat memengaruhi hasil resolusi.

Hash Penggantian Lokal

Jika modul root menyertakan local_path_overrides, bagian ini akan menyimpan hash dari file MODULE.bazel di repositori lokal. Hal ini memungkinkan pelacakan perubahan terhadap dependensi ini.

Grafik Dependensi Modul

moduleDepGraph mewakili hasil proses resolusi menggunakan input yang disebutkan di atas. Ia membentuk grafik dependensi dari semua modul yang diperlukan untuk menjalankan proyek.

Ekstensi Modul

Bagian moduleExtensions adalah peta yang hanya menyertakan ekstensi yang digunakan dalam pemanggilan saat ini atau yang sebelumnya dipanggil, sembari mengecualikan ekstensi yang tidak lagi digunakan. Dengan kata lain, jika ekstensi tidak digunakan di seluruh grafik dependensi, grafik tersebut akan dihapus dari moduleExtensions peta.

Setiap entri dalam peta ini sesuai dengan ekstensi yang digunakan dan diidentifikasi berdasarkan yang berisi file dan nama. Nilai yang sesuai untuk setiap entri berisi atribut informasi relevan yang terkait dengan ekstensi tersebut:

  1. transitiveDigest Ringkasan implementasi ekstensi dan file .bzl transitif.
  2. generatedRepoSpecs yang merupakan hasil dari menjalankan ekstensi tersebut dengan input saat ini.

Faktor tambahan yang dapat memengaruhi hasil ekstensi adalah penggunaannya. Meskipun tidak disimpan di lockfile, penggunaan dipertimbangkan saat membandingkan status ekstensi saat ini dengan status yang ada di {i>lockfile<i}.

Praktik Terbaik

Untuk memaksimalkan manfaat fitur lockfile, pertimbangkan hal-hal berikut praktik:

  • Perbarui kunci file secara teratur untuk mencerminkan perubahan dalam dependensi proyek atau konfigurasi Anda. Hal ini memastikan bahwa build berikutnya didasarkan pada terbaru dan akurat.

  • Sertakan {i>lockfile<i} dalam kontrol versi untuk memfasilitasi kolaborasi dan memastikan bahwa semua anggota tim memiliki akses ke {i>lockfile<i} yang sama, yang konsisten di seluruh project.

Dengan mengikuti praktik terbaik ini, Anda dapat menggunakan {i>lockfile<i} secara efektif Bazel, yang mengarah ke pengalaman yang lebih efisien, andal, dan kolaboratif di alur kerja pengembangan perangkat lunak.