กฎที่เก็บ

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

หน้านี้จะครอบคลุมวิธีสร้างกฎของที่เก็บและให้ตัวอย่างสำหรับ รายละเอียดเพิ่มเติม

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

การสร้างกฎที่เก็บ

ในไฟล์ .bzl ให้ใช้เมธอด repository_rule เพื่อสร้างใหม่ และจัดเก็บไว้ในตัวแปรร่วม

กฎที่เก็บที่กำหนดเองจะใช้งานได้เช่นเดียวกับกฎที่เก็บในเครื่อง ทั้งนี้ มีแอตทริบิวต์ name ที่จำเป็นและทุกเป้าหมายมีอยู่ในไฟล์บิลด์ อาจเรียกว่า @<name>//package:target โดยที่ <name> คือค่าของ name

กฎจะโหลดเมื่อคุณสร้างขึ้นอย่างชัดเจน หรือหากเป็นทรัพยากร Dependency งานสร้าง ในกรณีนี้ Bazel จะเรียกใช้ฟังก์ชัน implementation ช่วงเวลานี้ อธิบายวิธีสร้างที่เก็บ เนื้อหา และไฟล์ BUILD

Attributes

แอตทริบิวต์เป็นอาร์กิวเมนต์กฎ เช่น url หรือ sha256 คุณต้องแสดงรายการ แอตทริบิวต์และประเภทเมื่อกำหนดกฎที่เก็บ

local_repository = repository_rule(
    implementation=_impl,
    local=True,
    attrs={"path": attr.string(mandatory=True)})

หากต้องการเข้าถึงแอตทริบิวต์ ให้ใช้ repository_ctx.attr.<attribute_name>

repository_rule ทั้งหมดมีแอตทริบิวต์ที่กำหนดไว้โดยนัย (เช่นเดียวกับบิลด์ กฎ) แอตทริบิวต์โดยนัย 2 รายการคือ name (เหมือนกับกฎบิลด์) และ repo_mapping คุณเข้าถึงชื่อกฎที่เก็บได้ด้วย repository_ctx.name ความหมายของ repo_mapping เหมือนกับ กฎที่เก็บแบบเนทีฟ local_repository และ new_local_repository

หากชื่อแอตทริบิวต์ขึ้นต้นด้วย _ จะเป็นแบบส่วนตัว และผู้ใช้ไม่สามารถตั้งชื่อได้

ฟังก์ชันการใช้งาน

กฎที่เก็บทุกกฎต้องมีฟังก์ชัน implementation ซึ่งประกอบด้วย ตรรกะที่แท้จริงของกฎ และจะดำเนินการในขั้นตอนการโหลดอย่างเคร่งครัด

ฟังก์ชันนี้มีพารามิเตอร์อินพุต repository_ctx เท่านั้น ฟังก์ชัน แสดงผล None เพื่อบ่งบอกว่ากฎทำซ้ำได้โดยพิจารณาจาก พารามิเตอร์ที่ระบุ หรือคำสั่งที่มีชุดของพารามิเตอร์สำหรับกฎนั้น จะเปลี่ยนกฎนั้นให้เป็นกฎที่ใช้งานได้ซ้ำที่สร้างที่เก็บเดียวกัน สำหรับ ตัวอย่างเช่น สำหรับกฎที่ติดตามที่เก็บ Git ที่หมายถึงการส่งคืน ตัวระบุคอมมิตแบบเฉพาะเจาะจง แทนที่จะเป็น Branch แบบลอยที่มีอยู่ ที่ระบุ

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

def _impl(repository_ctx):
  repository_ctx.symlink(repository_ctx.attr.path, "")

local_repository = repository_rule(
    implementation=_impl,
    ...)

ฟังก์ชันการใช้งานจะทำงานเมื่อใด

หากประกาศที่เก็บเป็น local แล้วเปลี่ยนทรัพยากร Dependency ในกราฟทรัพยากร Dependency (รวมถึงไฟล์ WORKSPACE ด้วย) จะ ทำให้เกิดการดำเนินการของฟังก์ชันการใช้งาน

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

สุดท้าย สำหรับที่เก็บที่ไม่ใช่ local จะมีการเปลี่ยนแปลงเฉพาะต่อไปนี้ ทรัพยากร Dependency อาจทำให้มีการรีสตาร์ท ดังนี้

  • ต้องใช้ .bzl ไฟล์เพื่อกำหนดกฎที่เก็บ
  • การประกาศกฎที่เก็บในไฟล์ WORKSPACE
  • ค่าของตัวแปรสภาพแวดล้อมที่ประกาศด้วย environ ของแอตทริบิวต์ repository_rule ค่าของตัวแปรสภาพแวดล้อมเหล่านั้นสามารถบังคับใช้จาก บรรทัดคำสั่งที่มี --action_env แฟล็ก (แต่แฟล็กนี้จะทำให้การดำเนินการทั้งหมดของบิลด์เป็นโมฆะ)
  • เนื้อหาของไฟล์ที่ใช้และอ้างถึงโดยป้ายกำกับ (เช่น //mypkg:label.txt ไม่ใช่ mypkg/label.txt)

การบังคับให้ดึงข้อมูลที่เก็บภายนอกอีกครั้ง

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

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

ตัวอย่าง

  • Toolchain ของ C++ ที่กำหนดค่าไว้โดยอัตโนมัติ: โมเดลนี้จะใช้กฎที่เก็บเพื่อสร้าง ไฟล์การกำหนดค่า C++ สำหรับ Bazel ด้วยการมองหาคอมไพเลอร์ C++ ในเครื่อง และแฟล็กที่คอมไพเลอร์ C++ รองรับ

  • ไปที่ที่เก็บ ใช้ repository_rule หลายรายการในการกำหนดรายการทรัพยากร Dependency ที่จำเป็นต่อการใช้กฎ Go

  • rules_jvm_external สร้าง ที่เก็บภายนอกชื่อ @maven โดยค่าเริ่มต้นที่สร้างเป้าหมายบิลด์ สำหรับอาร์ติแฟกต์ Maven ทุกรายการในแผนผัง Dependency แบบทรานซิทีฟ