ไฟล์ Bazel Lock

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

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

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

การใช้งาน Lockfile

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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