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

รายงานปัญหา ดูแหล่งที่มา

กำลังซ่อนทรัพยากร Dependency ใน WORKSPACE

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

โปรเจ็กต์ของฉัน/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 = "..."
)

ทรัพยากร Dependency ทั้ง 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

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

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

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

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

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

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

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

การสนับสนุนสำหรับ IPv6

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

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

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

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

    build --jvmopt=-Djava.net.preferIPv6Addresses

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

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

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

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

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

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