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

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

คุณเปิดใช้โหมดผู้ให้บริการได้โดยระบุ 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 ภายนอกของผู้ให้บริการสำหรับเป้าหมายที่ระบุ

หากต้องการระบุผู้ให้บริการของไลบรารีภายนอกทั้งหมดที่จําเป็นสําหรับการสร้างรูปแบบเป้าหมายที่ระบุ ให้เรียกใช้ 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 การสร้างกับคำสั่งนี้ได้และส่งผลต่อผลลัพธ์

สร้างเป้าหมายแบบออฟไลน์

เมื่อใช้ Vendor ของ 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(): เพื่อปักหมุดที่เก็บไปยังแหล่งที่มาปัจจุบันของผู้ให้บริการราวกับว่ามี Flag --override_repository สำหรับที่เก็บนี้ Bazel จะไม่อัปเดตซอร์สโค้ดที่มาจากผู้ให้บริการสำหรับรีโปนี้ขณะเรียกใช้คำสั่ง vendor เว้นแต่จะยกเลิกการปักหมุด ผู้ใช้สามารถแก้ไขและดูแลรักษาแหล่งที่มาของผู้ให้บริการสําหรับที่เก็บข้อมูลนี้ด้วยตนเอง

เช่น

ignore("@@rules_cc+")
pin("@@bazel_skylib+")

เมื่อใช้การกำหนดค่านี้

  • ระบบจะยกเว้นทั้ง 2 รีโปออกจากคำสั่งของผู้ให้บริการในภายหลัง
  • ระบบจะลบล้างที่เก็บ bazel_skylib ไปยังแหล่งที่มาที่อยู่ในไดเรกทอรีผู้ให้บริการ
  • ผู้ใช้สามารถแก้ไขแหล่งที่มาของ bazel_skylib ที่มาจากผู้ให้บริการได้อย่างปลอดภัย
  • หากต้องการเปลี่ยนผู้ให้บริการ bazel_skylib ผู้ใช้ต้องปิดใช้คำสั่ง PIN ก่อน

ทําความเข้าใจวิธีการทํางานของโหมดผู้ให้บริการ

Bazel จะดึงข้อมูล Dependency ภายนอกของโปรเจ็กต์ใน $(bazel info output_base)/external การจัดเตรียมการพึ่งพาภายนอกหมายถึงการย้ายไฟล์และไดเรกทอรีที่เกี่ยวข้องไปยังไดเรกทอรีของผู้ให้บริการที่ระบุ และใช้แหล่งที่มาของผู้ให้บริการสำหรับบิลด์ในภายหลัง

เนื้อหาที่ส่งให้พาร์ทเนอร์ ได้แก่

  • ไดเรกทอรีที่เก็บ
  • ไฟล์เครื่องหมายของ repo

ในระหว่างการบิลด์ หากไฟล์เครื่องหมายของ Vendor เป็นเวอร์ชันล่าสุดหรือมีการปักหมุดที่เก็บไว้ในไฟล์ VENDOR.bazel แล้ว Bazel จะใช้แหล่งที่มาของ Vendor โดยการสร้างลิงก์สัญลักษณ์ไปยังแหล่งที่มานั้นใน $(bazel info output_base)/external แทนที่จะเรียกใช้กฎที่เก็บ ไม่เช่นนั้น ระบบจะแสดงคำเตือนและ Bazel จะเปลี่ยนไปใช้การดึงข้อมูลรีโปเวอร์ชันล่าสุด

ไฟล์รีจิสทรีของผู้ให้บริการ

Bazel ต้องทำความละเอียดของโมดูล Bazel เพื่อดึงข้อมูล Dependency ภายนอก ซึ่งอาจต้องเข้าถึงไฟล์รีจิสทรีผ่านอินเทอร์เน็ต หากต้องการสร้างแบบออฟไลน์ ผู้ให้บริการ 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 ก็ตาม