ฟีเจอร์ไฟล์ล็อกใน Bazel ช่วยให้บันทึกเวอร์ชันหรือ การอ้างอิงเฉพาะของไลบรารีหรือแพ็กเกจซอฟต์แวร์ที่โปรเจ็กต์ต้องการได้ โดยจะทำได้ด้วยการจัดเก็บผลลัพธ์ของการแก้ปัญหาโมดูลและการประเมินส่วนขยาย ไฟล์ล็อกช่วยให้สร้างได้ซ้ำ จึงมั่นใจได้ว่าสภาพแวดล้อมในการพัฒนาจะสอดคล้องกัน นอกจากนี้ ยังช่วยเพิ่มประสิทธิภาพการสร้างโดยอนุญาตให้ Bazel ข้ามกระบวนการแก้ไขเมื่อไม่มีการเปลี่ยนแปลงในทรัพยากร Dependency ของโปรเจ็กต์ นอกจากนี้ ไฟล์ล็อกยังช่วยปรับปรุงความเสถียรด้วยการป้องกันการอัปเดตที่ไม่คาดคิดหรือการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบในไลบรารีภายนอก ซึ่งจะช่วยลดความเสี่ยงในการทำให้เกิดข้อบกพร่อง
การสร้างไฟล์ล็อก
ระบบจะสร้างไฟล์ล็อกภายใต้รูทของพื้นที่ทำงานโดยใช้ชื่อ
MODULE.bazel.lock
สร้างหรืออัปเดตระหว่างกระบวนการบิลด์
โดยเฉพาะหลังจากที่แก้ไขโมดูลและประเมินส่วนขยายแล้ว ไฟล์ล็อก
จะบันทึกสถานะปัจจุบันของโปรเจ็กต์ รวมถึงไฟล์ MODULE, แฟล็ก
การลบล้าง และข้อมูลอื่นๆ ที่เกี่ยวข้อง ที่สำคัญคือจะรวมเฉพาะ
การอ้างอิงที่รวมอยู่ในการเรียกใช้การสร้างปัจจุบันเท่านั้น
เมื่อมีการเปลี่ยนแปลงในโปรเจ็กต์ที่ส่งผลต่อการอ้างอิง ระบบจะอัปเดตไฟล์ล็อกโดยอัตโนมัติเพื่อแสดงสถานะใหม่ ซึ่งจะช่วยให้ไฟล์ล็อก ยังคงมุ่งเน้นไปที่ชุดการอ้างอิงที่เฉพาะเจาะจงซึ่งจำเป็นสำหรับการบิลด์ปัจจุบัน และแสดงการอ้างอิงที่แก้ไขแล้วของโปรเจ็กต์ได้อย่างถูกต้อง
การใช้งานไฟล์ล็อก
คุณควบคุมไฟล์ล็อกได้โดยใช้แฟล็ก
--lockfile_mode
เพื่อ
ปรับแต่งลักษณะการทำงานของ Bazel เมื่อสถานะโปรเจ็กต์แตกต่างจาก
ไฟล์ล็อก โหมดที่ใช้ได้มีดังนี้
update
(ค่าเริ่มต้น): หากสถานะโปรเจ็กต์ตรงกับไฟล์ล็อก ระบบจะส่งคืนผลลัพธ์การแก้ปัญหาจากไฟล์ล็อกทันที มิเช่นนั้น ระบบจะดำเนินการแก้ไขและอัปเดตไฟล์ล็อกเพื่อให้แสดงสถานะปัจจุบันerror
: หากสถานะโปรเจ็กต์ตรงกับไฟล์ล็อก ระบบจะแสดงผลลัพธ์การแก้ไขจากไฟล์ล็อก มิฉะนั้น Bazel จะแสดงข้อผิดพลาดที่ระบุความแตกต่างระหว่างโปรเจ็กต์กับไฟล์ล็อค โหมดนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการตรวจสอบว่าการอ้างอิงของโปรเจ็กต์ยังคงไม่เปลี่ยนแปลง และถือว่าความแตกต่างใดๆ เป็นข้อผิดพลาดoff
: ไม่มีการตรวจสอบไฟล์ล็อกเลย
ประโยชน์ของไฟล์ล็อก
ไฟล์ล็อกมีประโยชน์หลายประการและใช้ได้หลายวิธี ดังนี้
บิลด์ที่ทำซ้ำได้ การบันทึกเวอร์ชันหรือทรัพยากร Dependency ที่เฉพาะเจาะจงของไลบรารีซอฟต์แวร์จะช่วยให้ไฟล์ล็อกมั่นใจได้ว่าบิลด์จะทำซ้ำได้ในสภาพแวดล้อมต่างๆ และเมื่อเวลาผ่านไป นักพัฒนาแอปสามารถพึ่งพาผลลัพธ์ที่สอดคล้องกันและคาดการณ์ได้เมื่อสร้างโปรเจ็กต์
ข้ามความละเอียดอย่างมีประสิทธิภาพ ไฟล์ล็อกช่วยให้ Bazel ข้ามกระบวนการแก้ไขได้หากไม่มีการเปลี่ยนแปลงในทรัพยากร Dependency ของโปรเจ็กต์ตั้งแต่การสร้างครั้งล่าสุด ซึ่งจะช่วยเพิ่มประสิทธิภาพการสร้างได้อย่างมาก โดยเฉพาะใน สถานการณ์ที่การแก้ไขอาจใช้เวลานาน
ความเสถียรและการลดความเสี่ยง ไฟล์ล็อกจะช่วยรักษาความเสถียรโดย ป้องกันการอัปเดตที่ไม่คาดคิดหรือการเปลี่ยนแปลงที่ทำให้เกิดข้อขัดข้องในไลบรารีภายนอก การล็อกการอ้างอิงไว้ที่เวอร์ชันที่เฉพาะเจาะจงจะช่วยลดความเสี่ยงในการทำให้เกิดข้อบกพร่อง เนื่องจากการอัปเดตที่ไม่เข้ากันหรือไม่ได้รับการทดสอบ
เนื้อหาของไฟล์ล็อก
ไฟล์ล็อกมีข้อมูลที่จำเป็นทั้งหมดเพื่อพิจารณาว่าสถานะของโปรเจ็กต์มีการเปลี่ยนแปลงหรือไม่ นอกจากนี้ ยังรวมถึงผลลัพธ์ของการสร้างโปรเจ็กต์ ในสถานะปัจจุบันด้วย ไฟล์ล็อกประกอบด้วย 2 ส่วนหลัก ได้แก่
- อินพุตของความละเอียดโมดูล เช่น
moduleFileHash
,flags
และlocalOverrideHashes
รวมถึงเอาต์พุตของความละเอียด ซึ่งคือmoduleDepGraph
- สำหรับส่วนขยายโมดูลแต่ละรายการ ไฟล์ล็อกจะมีอินพุตที่ส่งผลต่อส่วนขยายนั้น
ซึ่งแสดงด้วย
transitiveDigest
และเอาต์พุตของการเรียกใช้ส่วนขยายนั้น ซึ่งเรียกว่าgeneratedRepoSpecs
ต่อไปนี้คือตัวอย่างที่แสดงโครงสร้างของไฟล์ล็อก พร้อมคำอธิบายสำหรับแต่ละส่วน
{
"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",
...
}
}
}
}
}
แฮชไฟล์โมดูล
moduleFileHash
แสดงถึงแฮชของเนื้อหาไฟล์ MODULE.bazel
หากมีการเปลี่ยนแปลงในไฟล์นี้ ค่าแฮชจะแตกต่างกัน
ธง
ออบเจ็กต์ Flags
จะจัดเก็บแฟล็กทั้งหมดที่อาจส่งผลต่อผลลัพธ์การแก้ไข
แฮชการลบล้างในเครื่อง
หากโมดูลรูทรวม local_path_overrides
ส่วนนี้จะจัดเก็บแฮชของไฟล์ MODULE.bazel
ในที่เก็บในเครื่อง ซึ่งช่วยให้ติดตามการเปลี่ยนแปลง
ในทรัพยากรนี้ได้
กราฟทรัพยากร Dependency ของโมดูล
moduleDepGraph
แสดงผลลัพธ์ของกระบวนการแก้ไขโดยใช้
อินพุตที่กล่าวถึงข้างต้น ซึ่งจะสร้างกราฟทรัพยากร Dependency ของโมดูลทั้งหมด
ที่จำเป็นต่อการเรียกใช้โปรเจ็กต์
ส่วนขยายโมดูล
ส่วน moduleExtensions
คือแผนที่ที่มีเฉพาะส่วนขยายที่ใช้
ในการเรียกใช้ปัจจุบันหรือที่เรียกใช้ก่อนหน้านี้ โดยไม่รวมส่วนขยาย
ที่ไม่ได้ใช้งานอีกต่อไป กล่าวคือ หากไม่มีการใช้ส่วนขยายในกราฟการอ้างอิงอีกต่อไป ระบบจะนำส่วนขยายนั้นออกจากmoduleExtensions
แผนที่
แต่ละรายการในแผนที่นี้จะสอดคล้องกับส่วนขยายที่ใช้ และระบุโดยไฟล์และชื่อที่ประกอบด้วย ค่าที่สอดคล้องกันสำหรับแต่ละรายการจะมี ข้อมูลที่เกี่ยวข้องซึ่งเชื่อมโยงกับส่วนขยายนั้นๆ ดังนี้
transitiveDigest
ไดเจสต์ของการติดตั้งใช้งานส่วนขยายและไฟล์ .bzl แบบทรานซิทีฟgeneratedRepoSpecs
ผลลัพธ์ของการเรียกใช้ส่วนขยายนั้นด้วย อินพุตปัจจุบัน
อีกปัจจัยหนึ่งที่อาจส่งผลต่อผลลัพธ์ของส่วนขยายคือการใช้งาน แม้ว่าจะไม่ได้จัดเก็บไว้ในไฟล์ล็อก แต่การใช้งานจะได้รับการพิจารณาเมื่อเปรียบเทียบ สถานะปัจจุบันของส่วนขยายกับสถานะในไฟล์ล็อก
แนวทางปฏิบัติแนะนำ
โปรดพิจารณาแนวทางปฏิบัติแนะนำต่อไปนี้เพื่อรับประโยชน์สูงสุดจากฟีเจอร์ไฟล์ล็อก
อัปเดตไฟล์ล็อกเป็นประจำเพื่อให้สอดคล้องกับการเปลี่ยนแปลงในทรัพยากร Dependency ของโปรเจ็กต์หรือ การกำหนดค่า ซึ่งจะช่วยให้มั่นใจได้ว่าบิลด์ที่ตามมาจะอิงตามชุดการอ้างอิงที่ถูกต้องและเป็นปัจจุบันที่สุด
รวมไฟล์ล็อกในการควบคุมเวอร์ชันเพื่ออำนวยความสะดวกในการทำงานร่วมกันและ ตรวจสอบว่าสมาชิกในทีมทุกคนมีสิทธิ์เข้าถึงไฟล์ล็อกเดียวกัน ซึ่งจะช่วยส่งเสริม สภาพแวดล้อมการพัฒนาที่สอดคล้องกันในโปรเจ็กต์
การทำตามแนวทางปฏิบัติแนะนำเหล่านี้จะช่วยให้คุณใช้ฟีเจอร์ไฟล์ล็อก ใน Bazel ได้อย่างมีประสิทธิภาพ ซึ่งจะนำไปสู่เวิร์กโฟลว์การพัฒนาซอฟต์แวร์ที่มีประสิทธิภาพ เชื่อถือได้ และทำงานร่วมกันได้มากขึ้น