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

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

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

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

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

เช่น การเพิ่มรายการนี้ลงในไฟล์ .bazelrc ให้ทำดังนี้

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

ไดเรกทอรีผู้ให้บริการสามารถเป็นเส้นทางแบบสัมพัทธ์ไปยังรูทของพื้นที่ทำงานหรือ Absolute Path

จัดหาที่เก็บภายนอกที่เฉพาะเจาะจง

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

ตัวอย่างเช่น

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

หรือ

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

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

เช่น

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

เมื่อใช้การกำหนดค่านี้

  • ที่เก็บทั้ง 2 รายการจะไม่รวมอยู่ในคำสั่งของผู้ให้บริการที่ตามมาภายหลัง
  • ที่เก็บ 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

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

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

ตัวอย่างเช่น ถ้าลิงก์สัญลักษณ์เดิมคือ

<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

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

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