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