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

โหมดผู้ให้บริการเป็นฟีเจอร์ของ 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+

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

จัดหาไฟล์รีจิสทรี

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

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

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

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

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