โหมดผู้ให้บริการ

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

โหมดผู้ให้บริการคือฟีเจอร์ที่ช่วยให้คุณสร้างสำเนาในเครื่องของ การอ้างอิงภายนอกได้ ซึ่งจะเป็นประโยชน์สำหรับการสร้างแบบออฟไลน์ หรือเมื่อคุณต้องการ ควบคุมแหล่งที่มาของทรัพยากรภายนอก

เปิดใช้โหมดผู้ให้บริการ

คุณเปิดใช้โหมดผู้ให้บริการได้โดยระบุแฟล็ก --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 แล้วก็ตาม