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