การพึ่งพาเงาใน 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 ทำในการทดสอบ การเริ่มต้น)