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

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

การพึ่งพาเงาใน WORKSPACE

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

myproject/WORKSPACE

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"}
)

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

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

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

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

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

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

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

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

การรองรับ IPv6

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

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

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

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

    build --jvmopt=-Djava.net.preferIPv6Addresses

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

การสร้างแบบออฟไลน์

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

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

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

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