หน้านี้จะครอบคลุมวิธีสร้างกฎของที่เก็บและให้ตัวอย่างสำหรับ รายละเอียดเพิ่มเติม
ที่เก็บภายนอกเป็นกฎที่ใช้ได้เท่านั้น
ในไฟล์ WORKSPACE
และเปิดใช้การดำเนินการแบบไม่อิงตามอุณหภูมิในขั้นตอนการโหลด
ของ Bazel กฎที่เก็บภายนอกแต่ละกฎจะสร้างพื้นที่ทำงานของตนเอง โดย
เป็นเจ้าของไฟล์และอาร์ติแฟกต์ BUILD
รายการ ใช้เพื่อพึ่งพาบุคคลที่สาม
ไลบรารี (เช่น ไลบรารีแพ็กเกจ Maven) และสร้าง BUILD
ไฟล์ด้วย
ที่เฉพาะโฮสต์ Bazel กำลังทำงานอยู่
การสร้างกฎที่เก็บ
ในไฟล์ .bzl
ให้ใช้เมธอด
repository_rule เพื่อสร้างใหม่
และจัดเก็บไว้ในตัวแปรร่วม
กฎที่เก็บที่กำหนดเองจะใช้งานได้เช่นเดียวกับกฎที่เก็บในเครื่อง ทั้งนี้
มีแอตทริบิวต์ name
ที่จำเป็นและทุกเป้าหมายมีอยู่ในไฟล์บิลด์
อาจเรียกว่า @<name>//package:target
โดยที่ <name>
คือค่าของ
name
กฎจะโหลดเมื่อคุณสร้างขึ้นอย่างชัดเจน หรือหากเป็นทรัพยากร Dependency
งานสร้าง ในกรณีนี้ Bazel จะเรียกใช้ฟังก์ชัน implementation
ช่วงเวลานี้
อธิบายวิธีสร้างที่เก็บ เนื้อหา และไฟล์ BUILD
Attributes
แอตทริบิวต์คืออาร์กิวเมนต์กฎที่ส่งผ่านเป็นคำสั่งไปยังอาร์กิวเมนต์กฎ attrs
แอตทริบิวต์และประเภทของแอตทริบิวต์จะถูกระบุไว้เมื่อคุณกำหนด
กฎที่เก็บ ตัวอย่างการกำหนดแอตทริบิวต์ url
และ sha256
เป็น
สตริง:
local_repository = repository_rule(
implementation=_impl,
local=True,
attrs={
"url": attr.string(mandatory=True)
"sha256": attr.string(mandatory=True)
}
)
หากต้องการเข้าถึงแอตทริบิวต์ภายในฟังก์ชันการใช้งาน ให้ใช้
repository_ctx.attr.<attribute_name>
:
def _impl(repository_ctx):
url = repository_ctx.attr.url
checksum = repository_ctx.attr.sha256
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,
...)
ฟังก์ชันการใช้งานจะทำงานเมื่อใด
ฟังก์ชันการใช้งานของที่เก็บจะทำงานเมื่อ Bazel ต้องการ จากที่เก็บนั้น ตัวอย่างเช่นเมื่อเป้าหมายอื่น (ในอีก ) ขึ้นอยู่กับว่ามีการอ้างอิงหรือระบุในบรรทัดคำสั่งหรือไม่ จากนั้น ควรมีฟังก์ชันการใช้งานเพื่อสร้างที่เก็บในไฟล์ ระบบ วิธีนี้เรียกว่า "การดึงข้อมูล" ที่เก็บได้
ที่เก็บไม่จำเป็นต้องมีการดึงข้อมูลซ้ำเมื่อ มีการเปลี่ยนแปลงบางอย่างที่จะทำให้ที่เก็บแตกต่างจากเดิม นี่คือ เพราะยังมีบางอย่างที่ Bazel ไม่สามารถตรวจพบการเปลี่ยนแปลง หรือ ทำให้มีค่าใช้จ่ายมากเกินไปในทุกบิลด์ (ตัวอย่างเช่น สิ่งที่ดึงมา จากเครือข่าย) ดังนั้น ระบบจะดึงข้อมูลที่เก็บอีกครั้งก็ต่อเมื่อหนึ่งใน สิ่งที่จะเปลี่ยนไปมีดังนี้
- พารามิเตอร์ที่ส่งไปยังการประกาศของที่เก็บใน
WORKSPACE
ไฟล์ - โค้ด Starlark ประกอบด้วยการใช้งานที่เก็บ
- ค่าของตัวแปรสภาพแวดล้อมที่ประกาศด้วย
environ
ของrepository_rule
ค่าของตัวแปรสภาพแวดล้อมเหล่านี้สามารถเดินสายในคำสั่งได้ บรรทัดที่มี--action_env
แฟล็ก (แต่แฟล็กนี้จะทำให้การดำเนินการทั้งหมดของบิลด์เป็นโมฆะ) - เนื้อหาของไฟล์ที่ส่งไปยัง
read()
,execute()
และ เมธอดของrepository_ctx
ซึ่งอ้างอิงโดยป้ายกำกับ (ตัวอย่างเช่น//mypkg:label.txt
แต่ไม่ใช่mypkg/label.txt
) - เมื่อมีการเรียกใช้
bazel sync
มี 2 พารามิเตอร์ของ repository_rule
ที่ควบคุมเมื่อที่เก็บ
จะดึงข้อมูลอีกครั้ง:
- หากตั้งค่าแฟล็ก
configure
ไว้ ระบบจะดึงข้อมูลที่เก็บอีกครั้งเฉพาะในbazel sync
เมื่อมีการส่งพารามิเตอร์--configure
(หากพารามิเตอร์ ไม่ได้ตั้งค่า คำสั่งนี้จะไม่ทำให้มีการเรียกโฆษณาซ้ำ) หากตั้งค่าแฟล็ก
local
ไว้นอกเหนือกรณีข้างต้น ที่เก็บจะ จะดึงข้อมูลอีกครั้งเมื่อเซิร์ฟเวอร์ Bazel รีสตาร์ท หรือเมื่อไฟล์ที่ได้รับผลกระทบ การประกาศการเปลี่ยนแปลงที่เก็บ (เช่น ไฟล์WORKSPACE
หรือไฟล์ จะโหลด) ไม่ว่าการเปลี่ยนแปลงนั้นจะทำให้เกิดการเปลี่ยนแปลง การประกาศที่เก็บหรือโค้ดของที่เก็บในกรณีเหล่านี้จะไม่มีการดึงข้อมูลที่เก็บที่ไม่ใช่ในเครื่องอีกครั้ง นั่นเป็นเพราะ ที่เก็บข้อมูลเหล่านี้จะเชื่อมต่อกับเครือข่ายหรือมิเช่นนั้น มีราคาแพง
กำลังรีสตาร์ทฟังก์ชันการใช้งาน
คุณเริ่มใหม่ฟังก์ชันการใช้งานได้ในขณะที่ระบบกำลังจัดเก็บ ดึงข้อมูลหากทรัพยากร Dependency หายไป ในกรณีดังกล่าว การดำเนินการ ฟังก์ชันการใช้งานจะหยุด ทรัพยากร Dependency ที่ขาดหายไปจะได้รับการแก้ไข และ ฟังก์ชันนี้จะทำงานอีกครั้งหลังจากที่แปลค่าทรัพยากร Dependency แล้ว ถึง หลีกเลี่ยงการรีสตาร์ทที่ไม่จำเป็น (ซึ่งมีค่าใช้จ่ายสูงเนื่องจากการเข้าถึงเครือข่ายอาจ ซ้ำกัน) อาร์กิวเมนต์ป้ายกำกับจะถูกดึงข้อมูลล่วงหน้า โดยต้องมี อาร์กิวเมนต์ป้ายกำกับสามารถแก้ไขได้ในไฟล์ที่มีอยู่ โปรดทราบว่าการแก้ปัญหา เส้นทางจากสตริงหรือป้ายกำกับที่สร้างขึ้นระหว่างการดำเนินการเท่านั้น ของฟังก์ชันอาจทำให้เกิดการรีสตาร์ทได้
การบังคับให้ดึงข้อมูลที่เก็บภายนอกอีกครั้ง
บางครั้งที่เก็บภายนอกอาจล้าสมัยโดยไม่มีการเปลี่ยนแปลง
หรือทรัพยากร Dependency ต่างๆ ตัวอย่างเช่น แหล่งที่มาของการดึงข้อมูลที่เก็บอาจ
ติดตามสาขาที่เจาะจงของที่เก็บของบุคคลที่สาม และคอมมิตใหม่
ในสาขานั้น ในกรณีนี้ คุณสามารถขอให้ bazel ดึงข้อมูลทั้งหมดใหม่ได้ด้วย
ที่เก็บภายนอกอย่างไม่มีเงื่อนไขโดยการเรียกใช้ bazel sync
นอกจากนี้ กฎบางข้อจะตรวจสอบเครื่องภายในเครื่องและอาจกลายเป็น
ล้าสมัยหากเครื่องภายในได้รับการอัปเกรด ตรงนี้คุณสามารถขอให้ bazel ไปยัง
จะดึงข้อมูลที่เก็บภายนอกอีกครั้งเฉพาะที่
repository_rule
มีการตั้งค่าแอตทริบิวต์ configure
แล้ว ให้ใช้ bazel sync --configure
ตัวอย่าง
Toolchain ของ C++ ที่กำหนดค่าไว้โดยอัตโนมัติ: โมเดลนี้จะใช้กฎที่เก็บเพื่อสร้าง ไฟล์การกำหนดค่า C++ สำหรับ Bazel ด้วยการมองหาคอมไพเลอร์ C++ ในเครื่อง และแฟล็กที่คอมไพเลอร์ C++ รองรับ
ไปที่ที่เก็บ ใช้
repository_rule
หลายรายการในการกำหนดรายการทรัพยากร Dependency ที่จำเป็นต่อการใช้กฎ Gorules_jvm_external สร้าง ที่เก็บภายนอกชื่อ
@maven
โดยค่าเริ่มต้นที่สร้างเป้าหมายบิลด์ สำหรับอาร์ติแฟกต์ Maven ทุกรายการในแผนผัง Dependency แบบทรานซิทีฟ