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