ไฟล์ Bazel Lock

7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

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

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

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

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

Lockfile มีข้อดีหลายอย่างและใช้ประโยชน์ได้หลากหลายดังนี้

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

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

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

เนื้อหาของ Lockfile

ไฟล์ล็อกมีข้อมูลที่จำเป็นทั้งหมดเพื่อพิจารณาว่าสถานะของโปรเจ็กต์มีการเปลี่ยนแปลงหรือไม่ รวมถึงผลลัพธ์ของการสร้างโปรเจ็กต์ในสถานะปัจจุบันด้วย ไฟล์ล็อกประกอบด้วย 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 จะจัดเก็บ Flag ทั้งหมดที่อาจส่งผลต่อผลลัพธ์ความละเอียด

แฮชการลบล้างในเครื่อง

หากโมดูลรูทมี local_path_overrides ส่วนนี้จะจัดเก็บแฮชของไฟล์ MODULE.bazel ในที่เก็บข้อมูลในเครื่อง ซึ่งช่วยให้ติดตามการเปลี่ยนแปลงของข้อมูลนี้

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

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

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

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

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

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

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

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

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

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

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

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