หัวข้อขั้นสูงเกี่ยวกับทรัพยากร Dependency ภายนอก

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

ทรัพยากร Dependency ที่ซ่อนอยู่ใน WORKSPACE

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

โปรเจ็กต์ของฉัน/พื้นที่ทำงาน

workspace(name = "myproject")

local_repository(
    name = "A",
    path = "../A",
)
local_repository(
    name = "B",
    path = "../B",
)

A/WORKSPACE

workspace(name = "A")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "...",
)

B/WORKSPACE

workspace(name = "B")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)

ทั้ง A และ B ต้องใช้ testrunner เวอร์ชันต่างกัน รวมทั้ง 2 อย่างใน myproject โดยไม่ขัดแย้งกันโดยตั้งชื่อที่แตกต่างกันใน myproject/WORKSPACE:

workspace(name = "myproject")

load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
http_archive(
    name = "testrunner-v1",
    urls = ["https://github.com/testrunner/v1.zip"],
    sha256 = "..."
)
http_archive(
    name = "testrunner-v2",
    urls = ["https://github.com/testrunner/v2.zip"],
    sha256 = "..."
)
local_repository(
    name = "A",
    path = "../A",
    repo_mapping = {"@testrunner" : "@testrunner-v1"}
)
local_repository(
    name = "B",
    path = "../B",
    repo_mapping = {"@testrunner" : "@testrunner-v2"}
)

คุณใช้กลไกนี้เพื่อต่อเพชรเข้าด้วยกันได้ด้วย เช่น หาก A และ B มีทรัพยากร Dependency เดียวกันแต่เรียกด้วยชื่อต่างกัน ให้รวม Dependency เหล่านั้นใน myproject/WORKSPACE

การลบล้างที่เก็บจากบรรทัดคำสั่ง

หากต้องการลบล้างที่เก็บข้อมูลที่ประกาศไว้ด้วยที่เก็บข้อมูลในเครื่องจากบรรทัดคำสั่ง ให้ใช้ Flag --override_repository การใช้ Flag นี้จะเปลี่ยนเนื้อหาของที่เก็บข้อมูลภายนอกโดยไม่ต้องเปลี่ยนซอร์สโค้ด

เช่น หากต้องการลบล้าง @foo ไปยังไดเรกทอรีในเครื่อง /path/to/local/foo ให้ส่งผ่าน Flag --override_repository=foo=/path/to/local/foo

กรณีการใช้งานมีดังนี้

  • ปัญหาการแก้ไขข้อบกพร่อง เช่น การลบล้างที่เก็บ http_archive ไปยังไดเรกทอรีในเครื่องที่คุณทำการเปลี่ยนแปลงได้ง่ายขึ้น
  • เวนเดอร์ริง หากคุณอยู่ในสภาพแวดล้อมที่ไม่สามารถเรียกใช้เครือข่าย ให้ลบล้างกฎที่เก็บข้อมูลที่อิงตามเครือข่ายเพื่อชี้ไปยังไดเรกทอรีในเครื่องแทน

การใช้พร็อกซี

Bazel รับที่อยู่พร็อกซีจากตัวแปรสภาพแวดล้อม HTTPS_PROXY และ HTTP_PROXY และใช้ตัวแปรเหล่านี้เพื่อดาวน์โหลดไฟล์ HTTP และ HTTPS (หากระบุ)

การรองรับ IPv6

ในเครื่องที่ใช้ IPv6 เท่านั้น Bazel จะดาวน์โหลดทรัพยากรที่เกี่ยวข้องได้โดยไม่ต้องเปลี่ยนแปลง อย่างไรก็ตาม สำหรับเครื่อง IPv4/IPv6 แบบ 2 สแต็ก Bazel ใช้รูปแบบเดียวกันกับ Java โดยแนะนำให้ใช้ IPv4 หากเปิดใช้ ในบางกรณี เช่น เมื่อเครือข่าย IPv4 ไม่สามารถแก้ไข/เข้าถึงที่อยู่ภายนอกได้ อาจทำให้เกิดข้อยกเว้น Network unreachable และการสร้างไม่สำเร็จ ในกรณีเหล่านี้ คุณสามารถลบล้างลักษณะการทํางานของ Bazel เพื่อเลือกใช้ IPv6 โดยใช้java.net.preferIPv6Addresses=trueพร็อพเพอร์ตี้ของระบบ กล่าวอย่างเจาะจงคือ

  • ใช้--host_jvm_args=-Djava.net.preferIPv6Addresses=true startup option เช่น เพิ่มบรรทัดต่อไปนี้ในไฟล์ .bazelrc

    startup --host_jvm_args=-Djava.net.preferIPv6Addresses=true

  • เมื่อเรียกใช้เป้าหมายการสร้าง Java ที่ต้องเชื่อมต่ออินเทอร์เน็ต (เช่น สําหรับการทดสอบการผสานรวม) ให้ใช้--jvmopt=-Djava.net.preferIPv6Addresses=trueflag ของเครื่องมือ ตัวอย่างเช่น ใส่ข้อมูลต่อไปนี้ในไฟล์ .bazelrc

    build --jvmopt=-Djava.net.preferIPv6Addresses

  • หากคุณใช้ rules_jvm_external สำหรับความละเอียดของเวอร์ชันทรัพยากร Dependency ให้เพิ่ม -Djava.net.preferIPv6Addresses=true ลงในตัวแปรสภาพแวดล้อม COURSIER_OPTS เพื่อระบุตัวเลือก JVM สำหรับ Coursier ด้วย

บิลด์แบบออฟไลน์

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

สำหรับบิลด์แบบออฟไลน์จริงที่เอนทิตีอื่นเป็นผู้จัดหาไฟล์ที่จำเป็นทั้งหมด Bazel รองรับตัวเลือก --distdir Flag นี้จะบอกให้ Bazel มองหาในไดเรกทอรีที่ระบุโดยตัวเลือกนั้นก่อน เมื่อกฎที่เก็บข้อมูลขอให้ Bazel ดึงข้อมูลไฟล์ที่มี ctx.download หรือ ctx.download_and_extract เมื่อระบุผลรวมแฮชของไฟล์ที่ต้องการ Bazel จะค้นหาไฟล์ที่ตรงกับชื่อฐานของ URL แรก และใช้สำเนาในเครื่องหากแฮชตรงกัน

Bazel เองก็ใช้เทคนิคนี้ในการเริ่มต้นระบบแบบออฟไลน์จาก distribution artifact ซึ่งทําโดยรวบรวมทรัพยากร Dependency ภายนอกทั้งหมดที่จําเป็นใน distdir_tar ภายใน

Bazel อนุญาตให้เรียกใช้คําสั่งแบบใดก็ได้ในกฎของที่เก็บข้อมูลโดยที่ไม่รู้เลยว่าคําสั่งดังกล่าวเรียกใช้เครือข่ายหรือไม่ จึงบังคับใช้การสร้างแบบออฟไลน์ทั้งหมดไม่ได้ หากต้องการทดสอบว่าบิลด์ทำงานแบบออฟไลน์ได้อย่างถูกต้องหรือไม่ ให้บล็อกเครือข่ายด้วยตนเอง (อย่างที่ Bazel ทำในการทดสอบ Bootstrap)