Fitur lockfile di Bazel memungkinkan perekaman versi atau dependensi tertentu dari library atau paket software yang diperlukan oleh project. Fitur ini mencapainya dengan menyimpan hasil resolusi modul dan evaluasi ekstensi. Lockfile mempromosikan build yang dapat direproduksi, sehingga memastikan lingkungan pengembangan yang konsisten. Selain itu, lockfile meningkatkan efisiensi build dengan memungkinkan 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 pada library eksternal, sehingga mengurangi risiko munculnya bug.
Pembuatan Lockfile
Lockfile dibuat di bawah root ruang kerja dengan nama MODULE.bazel.lock. Lockfile dibuat atau diperbarui selama proses build, khususnya setelah resolusi modul dan evaluasi ekstensi. Lockfile menangkap status project saat ini, termasuk file MODULE, tanda, penggantian, dan informasi relevan lainnya. Yang penting, lockfile hanya menyertakan dependensi yang disertakan dalam pemanggilan build saat ini.
Jika terjadi perubahan dalam project yang memengaruhi dependensinya, lockfile akan otomatis diperbarui untuk mencerminkan status baru. Hal ini memastikan lockfile tetap berfokus pada kumpulan dependensi tertentu yang diperlukan untuk build saat ini, sehingga memberikan representasi yang akurat dari dependensi project yang diselesaikan.
Penggunaan Lockfile
Lockfile dapat dikontrol oleh tanda
--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 langsung ditampilkan dari lockfile. Jika tidak, resolusi akan dieksekusi, dan lockfile 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 lockfile. Mode ini sangat berguna jika Anda ingin memastikan dependensi project tetap tidak berubah, dan perbedaan apa pun akan diperlakukan sebagai error.off: Lockfile tidak diperiksa sama sekali.
Manfaat Lockfile
Lockfile menawarkan beberapa manfaat dan dapat digunakan dengan berbagai cara:
Build yang dapat direproduksi. Dengan menangkap 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 membuat project.
Melewatkan resolusi yang efisien. Lockfile memungkinkan Bazel melewati proses resolusi jika tidak ada perubahan dalam dependensi project sejak build terakhir. Hal ini meningkatkan efisiensi build secara signifikan, terutama dalam skenario ketika resolusi dapat memakan waktu.
Stabilitas dan pengurangan risiko. Lockfile membantu mempertahankan stabilitas dengan mencegah update yang tidak terduga atau perubahan yang dapat menyebabkan gangguan pada library eksternal. Dengan mengunci dependensi ke versi tertentu, risiko munculnya bug karena update yang tidak kompatibel atau tidak diuji akan berkurang.
Isi Lockfile
Lockfile berisi semua informasi yang diperlukan untuk menentukan apakah status project telah berubah. Lockfile juga menyertakan hasil pembuatan project dalam status saat ini. Lockfile terdiri dari dua bagian utama:
- Input resolusi modul, seperti
moduleFileHash,flags, danlocalOverrideHashes, serta output resolusi, yaitumoduleDepGraph. - Untuk setiap ekstensi modul, lockfile menyertakan input yang memengaruhinya, yang diwakili oleh
transitiveDigest, dan output dari menjalankan ekstensi yang disebut sebagaigeneratedRepoSpecs
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": {
"transitiveDigest": "oWDzxG/aLnyY6Ubrfy....+Jp6maQvEPxn0pBM=",
"generatedRepoSpecs": {
"hello": {
"bzlFile": "@@//:extension.bzl",
...
}
}
}
}
}
Hash File Modul
moduleFileHash mewakili hash konten file MODULE.bazel. Jika ada perubahan pada file ini, nilai hash akan berbeda.
Tanda
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 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. Grafik 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 sebelumnya, sekaligus mengecualikan ekstensi yang tidak lagi digunakan. Dengan kata lain, jika ekstensi tidak lagi digunakan di seluruh grafik dependensi, ekstensi tersebut akan dihapus dari peta moduleExtensions.
Setiap entri dalam peta ini sesuai dengan ekstensi yang digunakan dan diidentifikasi berdasarkan file dan nama yang berisi ekstensi tersebut. Nilai yang sesuai untuk setiap entri berisi informasi relevan yang terkait dengan ekstensi tersebut:
transitiveDigestringkasan implementasi ekstensi dan file .bzl transitifnya.generatedRepoSpecshasil menjalankan ekstensi tersebut dengan input saat ini.
Faktor tambahan yang dapat memengaruhi hasil ekstensi adalah penggunaannya. Meskipun tidak disimpan dalam lockfile, penggunaan akan dipertimbangkan saat membandingkan status ekstensi saat ini dengan status di lockfile.
Praktik Terbaik
Untuk memaksimalkan manfaat fitur lockfile, pertimbangkan praktik terbaik berikut:
Perbarui lockfile secara rutin untuk mencerminkan perubahan dalam dependensi atau konfigurasi project. Hal ini memastikan bahwa build berikutnya didasarkan pada kumpulan dependensi yang paling baru dan akurat.
Sertakan lockfile dalam kontrol versi untuk memfasilitasi kolaborasi dan memastikan bahwa semua anggota tim memiliki akses ke lockfile yang sama, sehingga mendorong lingkungan pengembangan yang konsisten di seluruh project.
Dengan mengikuti praktik terbaik ini, Anda dapat menggunakan fitur lockfile di Bazel secara efektif, sehingga menghasilkan alur kerja pengembangan software yang lebih efisien, andal, dan kolaboratif.