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