โหมดผู้ให้บริการเป็นฟีเจอร์ของ Bzlmod ที่ให้คุณสร้างสำเนาในตัวเครื่องของทรัพยากร Dependency ภายนอกได้ วิธีนี้มีประโยชน์สำหรับบิลด์แบบออฟไลน์ หรือเมื่อคุณต้องการควบคุมแหล่งที่มาของทรัพยากร Dependency ภายนอก
เปิดใช้โหมดผู้ให้บริการ
คุณเปิดใช้โหมดผู้ให้บริการได้โดยการระบุ Flag --vendor_dir
เช่น การเพิ่มลงในไฟล์ .bazelrc
# Enable vendor mode with vendor directory under <workspace>/vendor_src
common --vendor_dir=vendor_src
ไดเรกทอรีผู้ให้บริการอาจเป็นเส้นทางแบบสัมพัทธ์ไปยังรูทของพื้นที่ทำงานหรือเส้นทางแบบสัมบูรณ์ก็ได้
ผู้ให้บริการที่เก็บข้อมูลภายนอกที่เฉพาะเจาะจง
คุณสามารถใช้คำสั่ง vendor
ที่มี Flag --repo
เพื่อระบุที่เก็บข้อมูลที่จะส่งไปยังผู้ให้บริการ โดยระบบจะยอมรับทั้งชื่อที่เก็บข้อมูลหลักและชื่อที่เก็บข้อมูล
ตัวอย่างเช่น
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
เพื่อวิเคราะห์รูปแบบเป้าหมาย ดังนั้นจึงใช้ Flag การสร้างกับคําสั่งนี้ได้และส่งผลต่อผลลัพธ์
สร้างเป้าหมายแบบออฟไลน์
เมื่อใช้ผู้ให้บริการทรัพยากร Dependency ภายนอก คุณจะสร้างเป้าหมายแบบออฟไลน์ได้โดย
bazel build --vendor_dir=vendor_src //src/main:hello-world //src/test/...
บิลด์ควรทำงานได้ในสภาพแวดล้อมของบิลด์ที่สะอาดโดยไม่มีการเข้าถึงเครือข่ายและแคชที่เก็บ
คุณจึงควรตรวจสอบแหล่งที่มาของผู้ให้บริการและสร้างเป้าหมายเดียวกันแบบออฟไลน์ในเครื่องอื่นได้
ผู้ให้บริการทรัพยากร Dependency ภายนอกทั้งหมด
หากต้องการระบุแหล่งที่มาของที่เก็บข้อมูลทั้งหมดในกราฟการอ้างอิงภายนอกแบบทรานซิทีฟ ให้ใช้คำสั่งต่อไปนี้
bazel vendor --vendor_dir=vendor_src
โปรดทราบว่าการให้บริการทรัพยากร Dependency ทั้งหมดมีข้อเสียบางอย่าง ดังนี้
- การดึงข้อมูลที่เก็บทั้งหมดซึ่งรวมถึงที่เก็บที่ได้รับการแนะนำชั่วคราวอาจใช้เวลานาน
- ไดเรกทอรีผู้ให้บริการอาจมีขนาดใหญ่มาก
- ที่เก็บบางรายการอาจดึงข้อมูลไม่ได้หากเข้ากันไม่ได้กับแพลตฟอร์มหรือสภาพแวดล้อมปัจจุบัน
ดังนั้น ให้พิจารณาใช้พาร์ทเนอร์สำหรับเป้าหมายที่เฉพาะเจาะจงก่อน
กำหนดค่าโหมดผู้ให้บริการด้วย VENDOR.bazel
คุณควบคุมวิธีจัดการที่เก็บข้อมูลหนึ่งๆ ได้โดยใช้ไฟล์ VENDOR.bazel ซึ่งอยู่ในไดเรกทอรี vendor
คำสั่งมี 2 รายการ ซึ่งทั้ง 2 รายการยอมรับรายการชื่อที่ถูกต้องของรีโปเป็นอาร์กิวเมนต์
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
การจัดเตรียมการพึ่งพาภายนอกหมายถึงการย้ายไฟล์และไดเรกทอรีที่เกี่ยวข้องไปยังไดเรกทอรีของผู้ให้บริการที่ระบุ และใช้แหล่งที่มาของผู้ให้บริการสำหรับบิลด์ในภายหลัง
เนื้อหาที่ส่งให้พาร์ทเนอร์ ได้แก่
- ไดเรกทอรีที่เก็บ
- ไฟล์ตัวทำเครื่องหมายที่เก็บ
ในระหว่างการบิลด์ หากไฟล์เครื่องหมายของ Vendor เป็นเวอร์ชันล่าสุดหรือมีการปักหมุดที่เก็บไว้ในไฟล์ VENDOR.bazel แล้ว Bazel จะใช้แหล่งที่มาของ Vendor โดยการสร้างลิงก์สัญลักษณ์ไปยังแหล่งที่มานั้นใน $(bazel info output_base)/external
แทนที่จะเรียกใช้กฎที่เก็บ ไม่เช่นนั้น ระบบจะแสดงคำเตือนและ Bazel จะเปลี่ยนไปใช้การดึงข้อมูลรีโปเวอร์ชันล่าสุด
ไฟล์รีจิสทรีของผู้ให้บริการ
Bazel ต้องทำความละเอียดของโมดูล Bazel เพื่อดึงข้อมูลการขึ้นต่อกันภายนอก ซึ่งอาจต้องมีการเข้าถึงไฟล์รีจิสทรีผ่านอินเทอร์เน็ต หากต้องการสร้างแบบออฟไลน์ ผู้ให้บริการ 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
หรือเทียบเท่าเพื่อไม่ให้เช็คอิน
เมื่อใช้กลยุทธ์นี้ สัญลักษณ์ลิงก์ในซอร์สโค้ดของ Vendor ควรทํางานได้อย่างถูกต้องแม้ว่าจะมีการย้ายซอร์สโค้ดของ Vendor ไปยังตำแหน่งอื่นหรือมีการเปลี่ยนแปลงฐานเอาต์พุต Bazel ก็ตาม