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