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