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

วันที่ รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

การแก้ไขทรัพยากร Dependency ใน WORKSPACE

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

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

workspace(name = "myproject")

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

พื้นที่ทำงาน

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(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 เวอร์ชันที่แตกต่างกัน รวมทั้งสองประเภทใน 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

Bazel ดาวน์โหลดทรัพยากร Dependency ได้โดยไม่มีการเปลี่ยนแปลงในเครื่องที่ใช้ IPv6 เท่านั้น อย่างไรก็ตาม บนเครื่อง IPv4/IPv6 แบบ 2 สแต็ก 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 Flag ตัวอย่างเช่น รวมไว้ใน .bazelrc file:

    build --jvmopt=-Djava.net.preferIPv6Addresses

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