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