ไฟล์ Bazel Lock

ฟีเจอร์ไฟล์ล็อกใน Bazel ช่วยให้บันทึกเวอร์ชันหรือ การอ้างอิงเฉพาะของไลบรารีหรือแพ็กเกจซอฟต์แวร์ที่โปรเจ็กต์ต้องการได้ โดยจะทำได้ด้วยการจัดเก็บผลลัพธ์ของการแก้ปัญหาโมดูลและการประเมินส่วนขยาย ไฟล์ล็อกช่วยให้สร้างบิลด์ที่ทำซ้ำได้ จึงมั่นใจได้ว่าสภาพแวดล้อมในการพัฒนาจะสอดคล้องกัน นอกจากนี้ ยังช่วยเพิ่มประสิทธิภาพการบิลด์ด้วยการอนุญาตให้ Bazel ข้ามกระบวนการแก้ไขเมื่อไม่มีการเปลี่ยนแปลงในทรัพยากร Dependency ของโปรเจ็กต์ นอกจากนี้ ไฟล์ล็อกยังช่วยปรับปรุงความเสถียรด้วยการป้องกันการอัปเดตที่ไม่คาดคิดหรือการเปลี่ยนแปลงที่ส่งผลกับส่วนอื่นในระบบในไลบรารีภายนอก ซึ่งจะช่วยลดความเสี่ยงในการทำให้เกิดข้อบกพร่อง

การสร้างไฟล์ล็อก

ระบบจะสร้างไฟล์ล็อกภายใต้รูทของพื้นที่ทำงานโดยใช้ชื่อ MODULE.bazel.lock สร้างหรืออัปเดตระหว่างกระบวนการบิลด์ โดยเฉพาะหลังจากที่แก้ไขโมดูลและประเมินส่วนขยายแล้ว ไฟล์ล็อก จะบันทึกสถานะปัจจุบันของโปรเจ็กต์ รวมถึงไฟล์ MODULE, แฟล็ก การลบล้าง และข้อมูลอื่นๆ ที่เกี่ยวข้อง ที่สำคัญคือจะรวมเฉพาะทรัพยากร Dependency ที่รวมอยู่ในการเรียกใช้บิลด์ปัจจุบันเท่านั้น

เมื่อมีการเปลี่ยนแปลงในโปรเจ็กต์ที่ส่งผลต่อการอ้างอิง ระบบจะอัปเดตไฟล์ล็อกโดยอัตโนมัติเพื่อแสดงสถานะใหม่ การดำเนินการนี้จะช่วยให้ไฟล์ล็อก ยังคงมุ่งเน้นที่ชุดทรัพยากร Dependency ที่เฉพาะเจาะจงซึ่งจำเป็นสำหรับการสร้าง ปัจจุบัน ซึ่งแสดงถึงทรัพยากร Dependency ที่แก้ไขแล้วของโปรเจ็กต์ได้อย่างถูกต้อง

การใช้งานไฟล์ล็อก

คุณควบคุมไฟล์ล็อกได้โดยใช้แฟล็ก --lockfile_mode เพื่อ ปรับแต่งลักษณะการทำงานของ Bazel เมื่อสถานะโปรเจ็กต์แตกต่างจาก ไฟล์ล็อก โหมดที่ใช้ได้มีดังนี้

  • update (ค่าเริ่มต้น): หากสถานะโปรเจ็กต์ตรงกับไฟล์ล็อค ระบบจะส่งคืนผลลัพธ์การแก้ไขจากไฟล์ล็อคทันที มิเช่นนั้น ระบบจะดำเนินการแก้ไขและอัปเดตไฟล์ล็อกเพื่อให้แสดงสถานะปัจจุบัน
  • error: หากสถานะโปรเจ็กต์ตรงกับไฟล์ล็อก ระบบจะแสดงผลลัพธ์การแก้ไขจากไฟล์ล็อก มิฉะนั้น Bazel จะแสดงข้อผิดพลาดที่ระบุความแตกต่างระหว่างโปรเจ็กต์กับไฟล์ล็อค โหมดนี้มีประโยชน์อย่างยิ่งเมื่อคุณต้องการตรวจสอบว่าการอ้างอิงของโปรเจ็กต์ยังคงเหมือนเดิม และถือว่าความแตกต่างใดๆ เป็นข้อผิดพลาด
  • off: ไม่มีการตรวจสอบไฟล์ล็อกเลย

ประโยชน์ของไฟล์ล็อก

ไฟล์ล็อกมีประโยชน์หลายประการและใช้ได้หลายวิธี ดังนี้

  • บิลด์ที่ทำซ้ำได้ การบันทึกเวอร์ชันหรือการอ้างอิงที่เฉพาะเจาะจง ของไลบรารีซอฟต์แวร์จะช่วยให้ไฟล์ล็อกมั่นใจได้ว่าบิลด์จะทำซ้ำได้ ในสภาพแวดล้อมต่างๆ และเมื่อเวลาผ่านไป นักพัฒนาแอปสามารถพึ่งพาผลลัพธ์ที่สอดคล้องกันและคาดการณ์ได้เมื่อสร้างโปรเจ็กต์

  • ข้ามความละเอียดได้อย่างมีประสิทธิภาพ ไฟล์ล็อกช่วยให้ Bazel ข้ามกระบวนการแก้ไขได้หากไม่มีการเปลี่ยนแปลงในทรัพยากร Dependency ของโปรเจ็กต์ตั้งแต่การสร้างครั้งล่าสุด ซึ่งจะช่วยเพิ่มประสิทธิภาพการบิลด์ได้อย่างมาก โดยเฉพาะใน สถานการณ์ที่การแก้ไขอาจใช้เวลานาน

  • ความเสถียรและการลดความเสี่ยง ไฟล์ล็อกจะช่วยรักษาความเสถียรโดย ป้องกันการอัปเดตที่ไม่คาดคิดหรือการเปลี่ยนแปลงที่ทำให้เกิดข้อขัดข้องในไลบรารีภายนอก การล็อกการอ้างอิงไว้ที่เวอร์ชันที่เฉพาะเจาะจงจะช่วยลดความเสี่ยงในการทำให้เกิดข้อบกพร่องเนื่องจากการอัปเดตที่ไม่เข้ากันหรือยังไม่ได้ทดสอบ

เนื้อหาของไฟล์ล็อก

ไฟล์ล็อกมีข้อมูลที่จำเป็นทั้งหมดเพื่อพิจารณาว่าสถานะโปรเจ็กต์มีการเปลี่ยนแปลงหรือไม่ นอกจากนี้ ยังรวมถึงผลลัพธ์ของการสร้างโปรเจ็กต์ ในสถานะปัจจุบันด้วย ไฟล์ล็อกประกอบด้วย 2 ส่วนหลัก ได้แก่

  1. อินพุตของความละเอียดโมดูล เช่น moduleFileHash, flags และ localOverrideHashes รวมถึงเอาต์พุตของความละเอียด ซึ่งคือ moduleDepGraph
  2. สำหรับส่วนขยายโมดูลแต่ละรายการ ไฟล์ล็อกจะมีอินพุตที่ส่งผลต่อส่วนขยายนั้น ซึ่งแสดงด้วย 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 นี้ได้

กราฟทรัพยากร Dependency ของโมดูล

moduleDepGraph แสดงผลลัพธ์ของกระบวนการแก้ไขโดยใช้ อินพุตที่กล่าวถึงข้างต้น ซึ่งจะสร้างกราฟทรัพยากร Dependency ของโมดูลทั้งหมด ที่จำเป็นต่อการเรียกใช้โปรเจ็กต์

ส่วนขยายโมดูล

ส่วน moduleExtensions คือแผนที่ที่มีเฉพาะส่วนขยายที่ใช้ในการเรียกใช้ปัจจุบันหรือที่เรียกใช้ก่อนหน้านี้ โดยไม่รวมส่วนขยายที่ไม่ได้ใช้แล้ว กล่าวคือ หากไม่มีการใช้ส่วนขยายในกราฟการอ้างอิงอีกต่อไป ระบบจะนำส่วนขยายนั้นออกจากmoduleExtensions แผนที่

แต่ละรายการในแผนที่นี้สอดคล้องกับส่วนขยายที่ใช้และระบุโดยไฟล์และชื่อที่ประกอบด้วย ค่าที่สอดคล้องกันสำหรับแต่ละรายการจะมี ข้อมูลที่เกี่ยวข้องซึ่งเชื่อมโยงกับส่วนขยายนั้นๆ ดังนี้

  1. transitiveDigest ข้อมูลสรุปของการติดตั้งใช้งานส่วนขยายและไฟล์ .bzl แบบทรานซิทีฟ
  2. generatedRepoSpecs ผลลัพธ์ของการเรียกใช้ส่วนขยายนั้นด้วย อินพุตปัจจุบัน

อีกปัจจัยหนึ่งที่อาจส่งผลต่อผลลัพธ์ของส่วนขยายคือการใช้งาน แม้ว่าจะไม่ได้จัดเก็บไว้ในไฟล์ล็อก แต่การใช้งานจะได้รับการพิจารณาเมื่อเปรียบเทียบสถานะปัจจุบันของส่วนขยายกับสถานะในไฟล์ล็อก

แนวทางปฏิบัติแนะนำ

โปรดพิจารณาแนวทางปฏิบัติแนะนำต่อไปนี้เพื่อใช้ประโยชน์จากฟีเจอร์ไฟล์ล็อกให้ได้สูงสุด

  • อัปเดตไฟล์ล็อกเป็นประจำเพื่อให้สอดคล้องกับการเปลี่ยนแปลงในทรัพยากร Dependency ของโปรเจ็กต์หรือการกำหนดค่า เพื่อให้มั่นใจว่าการสร้างในภายหลังจะอิงตามชุดการอ้างอิงที่ถูกต้องและเป็นปัจจุบันที่สุด

  • รวมไฟล์ล็อกในการควบคุมเวอร์ชันเพื่ออำนวยความสะดวกในการทำงานร่วมกันและ ตรวจสอบว่าสมาชิกในทีมทุกคนมีสิทธิ์เข้าถึงไฟล์ล็อกเดียวกัน ซึ่งจะช่วยส่งเสริม สภาพแวดล้อมการพัฒนาที่สอดคล้องกันในโปรเจ็กต์

การทำตามแนวทางปฏิบัติแนะนำเหล่านี้จะช่วยให้คุณใช้ฟีเจอร์ไฟล์ล็อก ใน Bazel ได้อย่างมีประสิทธิภาพ ซึ่งจะนำไปสู่เวิร์กโฟลว์การพัฒนาซอฟต์แวร์ที่มีประสิทธิภาพ เชื่อถือได้ และทำงานร่วมกันได้มากขึ้น