โหมดผู้ให้บริการ

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

เปิดใช้โหมดผู้ให้บริการ

คุณเปิดใช้โหมดผู้ให้บริการได้โดยระบุแฟล็ก --vendor_dir

เช่น โดยการเพิ่มแฟล็กนี้ลงในไฟล์ .bazelrc

# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src

ไดเรกทอรีผู้ให้บริการอาจเป็นเส้นทางแบบสัมพัทธ์ไปยังรูทของเวิร์กสเปซหรือเส้นทางแบบสัมบูรณ์ก็ได้

ให้บริการที่เก็บข้อมูลภายนอกที่เฉพาะเจาะจง

คุณใช้คำสั่ง vendor กับแฟล็ก --repo เพื่อระบุที่เก็บข้อมูล ที่จะให้บริการได้ โดยคำสั่งนี้จะยอมรับทั้งชื่อที่เก็บข้อมูล Canonical และชื่อที่เก็บข้อมูลที่ปรากฏ

เช่น การเรียกใช้คำสั่ง

bazel vendor --vendor_dir=vendor_src --repo=@rules_cc

หรือ

bazel vendor --vendor_dir=vendor_src --repo=@@rules_cc+

จะทำให้กฎ_cc ได้รับการให้บริการภายใต้ <workspace root>/vendor_src/rules_cc+

ให้บริการทรัพยากร Dependency ภายนอกสำหรับเป้าหมายที่ระบุ

หากต้องการให้บริการทรัพยากร Dependency ภายนอกทั้งหมดที่จำเป็นสำหรับการสร้างรูปแบบเป้าหมายที่ระบุ คุณสามารถเรียกใช้ bazel vendor <target patterns>

เช่น

bazel vendor --vendor_dir=vendor_src //src/main:hello-world //src/test/...

จะให้บริการที่เก็บข้อมูลทั้งหมดที่จำเป็นสำหรับการสร้างเป้าหมาย //src/main:hello-world และเป้าหมายทั้งหมดภายใต้ //src/test/... ด้วยการกำหนดค่าปัจจุบัน

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

สร้างเป้าหมายแบบออฟไลน์

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

bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...

การบิลด์ควรทำงานได้ในสภาพแวดล้อมของบิลด์ที่สะอาดโดยไม่มีการเข้าถึงเครือข่ายและแคชที่เก็บข้อมูล

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

ให้บริการทรัพยากร Dependency ภายนอกทั้งหมด

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

bazel vendor --vendor_dir=vendor_src

โปรดทราบว่าการให้บริการทรัพยากร Dependency ทั้งหมดมีข้อเสีย บางประการ ดังนี้

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

ดังนั้น ให้พิจารณาการให้บริการสำหรับเป้าหมายที่เฉพาะเจาะจงก่อน

กำหนดค่าโหมดผู้ให้บริการด้วย VENDOR.bazel

คุณควบคุมวิธีจัดการที่เก็บข้อมูลที่ระบุได้ด้วยไฟล์ VENDOR.bazel ที่อยู่ในไดเรกทอรีผู้ให้บริการ

มีคำสั่ง 2 รายการที่พร้อมใช้งาน ซึ่งทั้ง 2 รายการจะยอมรับรายการชื่อที่เก็บข้อมูล Canonical เป็นอาร์กิวเมนต์

  • ignore(): เพื่อละเว้นที่เก็บข้อมูลจากโหมดผู้ให้บริการโดยสมบูรณ์
  • pin(): เพื่อปักหมุดที่เก็บข้อมูลไปยังแหล่งที่มาที่เวนเดอร์ริงปัจจุบันราวกับว่ามีแฟล็ก --override_repository สำหรับที่เก็บข้อมูลนี้ Bazel จะไม่อัปเดตแหล่งที่มาที่ให้บริการสำหรับที่เก็บข้อมูลนี้ขณะเรียกใช้คำสั่ง vendor เว้นแต่จะมีการยกเลิกการปักหมุด ผู้ใช้สามารถแก้ไขและดูแลรักษาแหล่งที่มาที่ให้บริการสำหรับที่เก็บข้อมูลนี้ด้วยตนเองได้

เช่น

ignore("@@rules_cc+")
pin("@@bazel_skylib+")

การกำหนดค่านี้จะทำให้เกิดผลลัพธ์ต่อไปนี้

  • ที่เก็บข้อมูลทั้ง 2 รายการจะถูกยกเว้นจากคำสั่ง vendor ในครั้งต่อๆ ไป
  • ที่เก็บข้อมูล bazel_skylib จะถูกลบล้างไปยังแหล่งที่มาที่อยู่ในไดเรกทอรีผู้ให้บริการ
  • ผู้ใช้สามารถแก้ไขแหล่งที่มาที่ให้บริการของ bazel_skylib ได้อย่างปลอดภัย
  • หากต้องการให้บริการ bazel_skylib อีกครั้ง ผู้ใช้ต้องปิดใช้คำสั่ง pin ก่อน

ทำความเข้าใจวิธีการทำงานของโหมดผู้ให้บริการ

Bazel จะดึงทรัพยากร Dependency ภายนอกของโปรเจ็กต์ภายใต้ $(bazel info output_base)/external การเวนเดอร์ริงทรัพยากร Dependency ภายนอกหมายถึงการย้ายไฟล์และไดเรกทอรีที่เกี่ยวข้องไปยังไดเรกทอรีผู้ให้บริการที่ระบุ และใช้แหล่งที่มาที่เวนเดอร์ริงสำหรับการสร้างในภายหลัง

เนื้อหาที่ให้บริการประกอบด้วย

  • ไดเรกทอรีที่เก็บข้อมูล
  • ไฟล์ตัวทำเครื่องหมายที่เก็บข้อมูล

ระหว่างการบิลด์ หากไฟล์ตัวทำเครื่องหมายที่ให้บริการเป็นเวอร์ชันล่าสุดหรือที่เก็บข้อมูลถูกปักหมุดไว้ในไฟล์ VENDOR.bazel แล้ว Bazel จะใช้แหล่งที่มาที่ให้บริการโดยสร้างลิงก์สัญลักษณ์ (symlink) ไปยังแหล่งที่มาดังกล่าวภายใต้ $(bazel info output_base)/external แทนที่จะเรียกใช้กฎของที่เก็บข้อมูลจริง ไม่เช่นนั้น ระบบจะพิมพ์คำเตือนและ Bazel จะกลับไปดึงเวอร์ชันล่าสุดของที่เก็บข้อมูล

ไฟล์รีจิสทรีของผู้ให้บริการ

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

ที่เก็บข้อมูลภายนอกอาจมีลิงก์สัญลักษณ์ (symlink) ที่ชี้ไปยังไฟล์หรือไดเรกทอรีอื่นๆ Bazel ใช้กลยุทธ์ต่อไปนี้เพื่อเขียนลิงก์สัญลักษณ์ (symlink) ใหม่ในแหล่งที่มาที่ให้บริการเพื่อให้แน่ใจว่าลิงก์สัญลักษณ์ (symlink) ทำงานได้อย่างถูกต้อง

  • สร้างลิงก์สัญลักษณ์ (symlink) <vendor_dir>/bazel-external ที่ชี้ไปยัง $(bazel info output_base)/external ระบบจะรีเฟรชลิงก์นี้โดยอัตโนมัติทุกครั้งที่เรียกใช้คำสั่ง Bazel
  • สำหรับแหล่งที่มาที่ให้บริการ ให้เขียนลิงก์สัญลักษณ์ (symlink) ทั้งหมดที่เดิมชี้ไปยัง เส้นทางภายใต้ $(bazel info output_base)/external ใหม่เป็นเส้นทางแบบสัมพัทธ์ภายใต้ <vendor_dir>/bazel-external

เช่น หากลิงก์สัญลักษณ์ (symlink) เดิมคือ

<vendor_dir>/repo_foo+/link  =>  $(bazel info output_base)/external/repo_bar+/file

ระบบจะเขียนใหม่เป็น

<vendor_dir>/repo_foo+/link  =>  ../../bazel-external/repo_bar+/file

โดยที่

<vendor_dir>/bazel-external  =>  $(bazel info output_base)/external  # This might be new if output base is changed

เนื่องจาก <vendor_dir>/bazel-external สร้างโดย Bazel โดยอัตโนมัติ เราจึงขอแนะนำให้เพิ่มลิงก์นี้ลงใน .gitignore หรือไฟล์ที่เทียบเท่าเพื่อหลีกเลี่ยงการตรวจสอบ

กลยุทธ์นี้จะช่วยให้ลิงก์สัญลักษณ์ (symlink) ในแหล่งที่มาที่ให้บริการทำงานได้อย่างถูกต้องแม้หลังจากย้ายแหล่งที่มาที่ให้บริการไปยังตำแหน่งอื่นหรือเปลี่ยนเอาต์พุตเบสของ Bazel แล้ว