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