หน้านี้ครอบคลุมวิธีสร้างกฎที่เก็บและแสดงตัวอย่างสำหรับรายละเอียดเพิ่มเติม
ที่เก็บข้อมูลภายนอกคือกฎที่ใช้ได้เฉพาะในไฟล์ WORKSPACE
และเปิดใช้การดำเนินการแบบไม่ปิดผนึกในระยะการโหลดของ Bazel กฎที่เก็บข้อมูลภายนอกแต่ละรายการจะสร้างพื้นที่ทํางานของตัวเอง โดยมีBUILD
ไฟล์และอาร์ติแฟกต์ของตัวเอง สามารถใช้เพื่อใช้ไลบรารีของบุคคลที่สาม (เช่น ไลบรารีที่แพ็กเกจ Maven) และยังใช้สร้างไฟล์ BUILD
สำหรับโฮสต์ที่ Bazel ทำงานอยู่โดยเฉพาะได้ด้วย
การสร้างกฎที่เก็บ
ในไฟล์ .bzl
ให้ใช้ฟังก์ชัน repository_rule เพื่อสร้างกฎใหม่ของที่เก็บข้อมูลและจัดเก็บไว้ในตัวแปรส่วนกลาง
คุณใช้กฎที่เก็บข้อมูลที่กำหนดเองได้เช่นเดียวกับกฎที่เก็บข้อมูลแบบเนทีฟ ซึ่งอาจมีแอตทริบิวต์ name
ที่จำเป็น และทุกเป้าหมายที่อยู่ในไฟล์บิลด์อาจเรียกว่า @<name>//package:target
โดยที่ <name>
คือค่าของแอตทริบิวต์ name
ระบบจะโหลดกฎเมื่อคุณสร้างกฎอย่างชัดเจน หรือหากกฎเป็นข้อกำหนดของบิลด์ ในกรณีนี้ 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
เพียง 1 รายการ ฟังก์ชันนี้จะแสดงผล 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 ที่ส่งคำขอ ระบบจะเรียกใช้ฟังก์ชันการติดตั้งใช้งานอีกครั้งหลังจากแก้ไขการพึ่งพาแล้ว ระบบจะดึงข้อมูลอาร์กิวเมนต์ป้ายกำกับล่วงหน้าเพื่อหลีกเลี่ยงการรีสตาร์ทที่ไม่จำเป็น (ซึ่งเสียค่าใช้จ่ายเนื่องจากอาจต้องมีการเข้าถึงเครือข่ายซ้ำ) ในกรณีที่อาร์กิวเมนต์ป้ายกำกับทั้งหมดแก้ไขเป็นไฟล์ที่มีอยู่ได้ โปรดทราบว่าการแก้ไขเส้นทางจากสตริงหรือป้ายกำกับที่สร้างในระหว่างการเรียกใช้ฟังก์ชันเท่านั้นอาจยังคงทําให้ระบบรีสตาร์ท
สุดท้าย สำหรับที่เก็บข้อมูลที่ไม่ใช่local
เฉพาะการเปลี่ยนแปลงในข้อกำหนดต่อไปนี้เท่านั้นที่อาจทําให้ระบบรีสตาร์ท
- ไฟล์
.bzl
ที่จําเป็นในการกําหนดกฎของที่เก็บ - การประกาศกฎของที่เก็บในไฟล์
WORKSPACE
- ค่าของตัวแปรสภาพแวดล้อมที่ประกาศด้วยแอตทริบิวต์
environ
ของฟังก์ชันrepository_rule
คุณบังคับใช้ค่าของตัวแปรสภาพแวดล้อมเหล่านั้นได้จากบรรทัดคำสั่งโดยใช้แฟล็ก--action_env
(แต่แฟล็กนี้จะทําให้การดำเนินการทั้งหมดของบิลด์เป็นโมฆะ) - เนื้อหาของไฟล์ที่ใช้และอ้างอิงโดยป้ายกำกับ (เช่น
//mypkg:label.txt
ไม่ใช่mypkg/label.txt
)
การบังคับให้ดึงข้อมูลที่เก็บภายนอกอีกครั้ง
บางครั้งที่เก็บภายนอกอาจล้าสมัยโดยไม่มีการเปลี่ยนแปลงคำจำกัดความหรือทรัพยากร Dependency ตัวอย่างเช่น ที่เก็บข้อมูลที่ดึงข้อมูลแหล่งที่มาอาจติดตามสาขาที่เฉพาะเจาะจงของที่เก็บข้อมูลของบุคคลที่สาม และคอมมิตใหม่จะพร้อมใช้งานในสาขานั้น ในกรณีนี้ คุณสามารถขอให้ Bazel ดึงข้อมูลรีโพซิทอรีภายนอกทั้งหมดอีกครั้งโดยไม่มีเงื่อนไขได้โดยเรียกใช้ bazel sync
นอกจากนี้ กฎบางข้อจะตรวจสอบเครื่องภายในและอาจล้าสมัยหากมีการอัปเกรดเครื่อง ในส่วนนี้ คุณสามารถขอให้ Bazel ดึงข้อมูลรีโพซิทอรี่ภายนอกเหล่านั้นอีกครั้งเฉพาะในกรณีที่คำจำกัดความ repository_rule
มีการตั้งค่าแอตทริบิวต์ configure
ให้ใช้ bazel sync --configure
ตัวอย่าง
เครื่องมือเชนการกำหนดค่าอัตโนมัติของ C++: จะใช้กฎที่เก็บเพื่อสร้างไฟล์การกำหนดค่า C++ โดยอัตโนมัติสำหรับ Bazel ด้วยการค้นหาคอมไพเลอร์ C++ ในเครื่อง สภาพแวดล้อม และแฟล็กที่คอมไพเลอร์ C++ รองรับ
ที่เก็บ Go ใช้
repository_rule
หลายรายการในการกำหนดรายการทรัพยากร Dependency ที่ต้องใช้กฎ Gorules_jvm_external จะสร้างที่เก็บข้อมูลภายนอกชื่อ
@maven
โดยค่าเริ่มต้น ซึ่งจะสร้างเป้าหมายการสร้างสำหรับอาร์ติแฟกต์ Maven ทั้งหมดในต้นไม้การพึ่งพาแบบทรานซิทีฟ