Lockfile Bazel

Laporkan masalah Lihat sumber

Fitur lockfile di Bazel memungkinkan perekaman versi tertentu atau dependensi library software atau paket yang diperlukan oleh suatu project. Hal ini mencapai hal ini dengan menyimpan hasil resolusi modul dan evaluasi ekstensi. Lockfile mempromosikan build yang dapat direproduksi, sehingga memastikan lingkungan pengembangan yang konsisten. Selain itu, hal ini akan meningkatkan efisiensi build dengan mengizinkan Bazel melewati proses resolusi jika tidak ada perubahan dalam dependensi project. Selain itu, lockfile meningkatkan stabilitas dengan mencegah update yang tidak terduga atau perubahan yang dapat menyebabkan gangguan di library eksternal, sehingga mengurangi risiko timbulnya bug.

Pembuatan File Kunci

Lockfile dibuat di root ruang kerja dengan nama MODULE.bazel.lock. Library ini dibuat atau diupdate selama proses build, khususnya setelah resolusi modul dan evaluasi ekstensi. File kunci mengambil status project saat ini, termasuk file MODUL, tanda, penggantian, dan informasi relevan lainnya. Yang penting, dependensi ini hanya mencakup dependensi yang disertakan dalam pemanggilan build saat ini.

Saat perubahan terjadi dalam project yang memengaruhi dependensinya, file kunci akan otomatis diupdate untuk mencerminkan status baru. Hal ini memastikan bahwa lockfile tetap fokus pada kumpulan dependensi tertentu yang diperlukan untuk build saat ini, sehingga memberikan representasi akurat dari dependensi project yang di-resolve.

Penggunaan Lockfile

Lockfile dapat dikontrol oleh flag --lockfile_mode untuk menyesuaikan perilaku Bazel saat status project berbeda dengan lockfile. Mode yang tersedia adalah:

  • update (Default): Jika status project cocok dengan lockfile, hasil resolusi akan segera ditampilkan dari lockfile. Jika tidak, resolusi akan dijalankan, dan file kunci akan diperbarui untuk mencerminkan status saat ini.
  • error: Jika status project cocok dengan lockfile, hasil resolusi akan ditampilkan dari lockfile. Jika tidak, Bazel akan menampilkan error yang menunjukkan variasi antara project dan file kunci. Mode ini sangat berguna saat Anda ingin memastikan bahwa dependensi project Anda tidak berubah, dan setiap perbedaan akan diperlakukan sebagai error.
  • off: Lockfile tidak diperiksa sama sekali.

Manfaat Lockfile

Lockfile menawarkan beberapa manfaat dan dapat digunakan dalam berbagai cara:

  • Build yang dapat direproduksi. Dengan mengambil versi atau dependensi tertentu dari library software, lockfile memastikan bahwa build dapat direproduksi di berbagai lingkungan dan dari waktu ke waktu. Developer dapat mengandalkan hasil yang konsisten dan dapat diprediksi saat membangun project mereka.

  • Lewati resolusi yang efisien. Lockfile memungkinkan Bazel melewati proses penyelesaian jika tidak ada perubahan dalam dependensi project sejak build terakhir. Hal ini akan meningkatkan efisiensi build secara signifikan, terutama dalam skenario yang dapat memakan waktu penyelesaian.

  • Stabilitas dan pengurangan risiko. File kunci membantu menjaga stabilitas dengan mencegah update yang tidak terduga atau perubahan yang dapat menyebabkan gangguan di library eksternal. Dengan mengunci dependensi ke versi tertentu, risiko timbulnya bug karena update yang tidak kompatibel atau yang belum diuji akan berkurang.

Isi File Kunci

Lockfile berisi semua informasi yang diperlukan untuk menentukan apakah status project telah berubah atau tidak. Ini juga mencakup hasil mem-build project dengan status saat ini. Lockfile terdiri dari dua bagian utama:

  1. Input resolusi modul, seperti moduleFileHash, flags, dan localOverrideHashes, serta output resolusi, yaitu moduleDepGraph.
  2. Untuk setiap ekstensi modul, lockfile menyertakan input yang memengaruhinya, yang diwakili oleh transitiveDigest, dan output menjalankan ekstensi tersebut yang disebut sebagai generatedRepoSpecs

Berikut adalah contoh yang menunjukkan struktur lockfile, beserta 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": {
      "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",
            ...
          }
        }
      }
    }
  }
}

Hash File Modul

moduleFileHash merepresentasikan hash konten file MODULE.bazel. Jika ada perubahan yang terjadi dalam file ini, nilai hash-nya akan berbeda.

Tanda

Objek Flags menyimpan semua flag yang dapat memengaruhi hasil resolusi.

Hash Penggantian Lokal

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

Grafik Dependensi Modul

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

Ekstensi Modul

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

Jika ekstensi tidak bergantung pada sistem operasi atau jenis arsitektur, bagian ini hanya menampilkan satu entri "umum". Jika tidak, beberapa entri akan disertakan, diberi nama berdasarkan OS, arsitektur, atau keduanya, dengan masing-masing entri sesuai dengan hasil evaluasi ekstensi pada hal-hal tersebut.

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

  1. Ringkasan implementasi ekstensi transitiveDigest dan file .bzl transitifnya.
  2. generatedRepoSpecs hasil menjalankan ekstensi tersebut dengan input saat ini.

Faktor tambahan yang dapat memengaruhi hasil ekstensi adalah penggunaannya. Meskipun tidak disimpan dalam lockfile, penggunaan dipertimbangkan saat membandingkan status ekstensi saat ini dengan status yang ada dalam file kunci.

Praktik Terbaik

Untuk memaksimalkan manfaat fitur lockfile, pertimbangkan praktik terbaik berikut:

  • Update lockfile secara rutin untuk mencerminkan perubahan dalam dependensi atau konfigurasi project. Hal ini memastikan bahwa build berikutnya didasarkan pada set dependensi terbaru dan akurat.

  • Sertakan lockfile dalam kontrol versi untuk memfasilitasi kolaborasi dan pastikan semua anggota tim memiliki akses ke lockfile yang sama, sehingga mempromosikan lingkungan pengembangan yang konsisten di seluruh project.

  • Gunakan bazelisk untuk menjalankan Bazel, dan sertakan file .bazelversion dalam kontrol versi yang menentukan versi Bazel yang sesuai dengan lockfile. Karena Bazel sendiri merupakan dependensi build Anda, lockfile ini dikhususkan untuk versi Bazel, dan akan berubah bahkan antara rilis Bazel yang kompatibel dengan versi sebelumnya. Menggunakan bazelisk akan memastikan bahwa semua developer menggunakan versi Bazel yang cocok dengan lockfile.

Dengan mengikuti praktik terbaik ini, Anda dapat memanfaatkan fitur lockfile di Bazel secara efektif, sehingga menghasilkan alur kerja pengembangan software yang lebih efisien, andal, dan kolaboratif.