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

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

ใช้กฎเวอร์ชันเดียวในโปรเจ็กต์ทุกครั้งที่เป็นไปได้ ซึ่งจำเป็นสำหรับทรัพยากร Dependency ที่คุณคอมไพล์และจะอยู่ในไบนารีสุดท้าย สำหรับกรณีอื่นๆ คุณสามารถซ่อนทรัพยากร 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 = "..."
)

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

นอกจากนี้ คุณยังใช้กลไกนี้เพื่อรวมทรัพยากร Dependency ที่มีลักษณะเป็นรูปสี่เหลี่ยมขนมเปียกปูนได้ด้วย เช่น หาก 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 แบบ Dual-stack Bazel จะใช้กฎเดียวกันกับ Java โดยจะเลือกใช้ IPv4 หากเปิดใช้อยู่ ในบางกรณี เช่น เมื่อเครือข่าย IPv4 แก้ไข/เข้าถึงที่อยู่ภายนอกไม่ได้ กรณีนี้อาจทำให้เกิดข้อยกเว้น Network unreachable และการสร้างล้มเหลว ในกรณีเหล่านี้ คุณสามารถลบล้าง ลักษณะการทำงานของ Bazel เพื่อเลือกใช้ 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 file ดังนี้

    build --jvmopt=-Djava.net.preferIPv6Addresses

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

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

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

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

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

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