หน้านี้จะอธิบายวิธีกำหนดกฎของที่เก็บและแสดงตัวอย่างเพื่อดูรายละเอียดเพิ่มเติม
ที่เก็บข้อมูลภายนอกคือลําดับชั้นไดเรกทอรีที่มีไฟล์ต้นฉบับที่นําไปใช้ในบิลด์ Bazel ได้ ซึ่งสร้างขึ้นตามคําขอโดยเรียกใช้กฎ repo ที่เกี่ยวข้อง คุณสามารถกำหนด Repos ได้หลายวิธี แต่ท้ายที่สุดแล้วที่เก็บแต่ละรายการจะกำหนดโดยการเรียกใช้กฎของที่เก็บ เช่นเดียวกับที่เป้าหมายบิลด์จะกำหนดโดยการเรียกใช้กฎบิลด์ สามารถใช้เพื่อใช้ไลบรารีของบุคคลที่สาม (เช่น ไลบรารีที่แพ็กเกจ Maven) และสร้างไฟล์ BUILD
สำหรับโฮสต์ที่ Bazel ทำงานอยู่โดยเฉพาะ
คําจํากัดความของกฎที่เก็บ
ในไฟล์ .bzl
ให้ใช้ฟังก์ชัน repository_rule เพื่อกำหนดกฎใหม่ของที่เก็บและจัดเก็บไว้ในตัวแปรส่วนกลาง หลังจากกำหนดกฎของ repo แล้ว คุณจะเรียกใช้กฎดังกล่าวเป็นฟังก์ชันเพื่อกำหนด repo ได้ โดยปกติแล้วการเรียกใช้นี้จะดำเนินการจากภายในฟังก์ชันการใช้งานส่วนขยายโมดูล
องค์ประกอบหลัก 2 อย่างของคําจํากัดความกฎของรีโปคือสคีมาแอตทริบิวต์และฟังก์ชันการใช้งาน สคีมาแอตทริบิวต์จะกำหนดชื่อและประเภทของแอตทริบิวต์ที่ส่งไปยังการเรียกใช้กฎที่เก็บ และเรียกใช้ฟังก์ชันการใช้งานเมื่อจำเป็นต้องดึงข้อมูลที่เก็บ
Attributes
แอตทริบิวต์คืออาร์กิวเมนต์ที่ส่งไปยังการเรียกใช้กฎของรีโป สคีมาของแอตทริบิวต์ที่กฎที่เก็บยอมรับจะระบุโดยใช้อาร์กิวเมนต์ attrs
เมื่อกำหนดกฎที่เก็บด้วยการเรียกใช้ repository_rule
ตัวอย่างการกำหนดแอตทริบิวต์ url
และ sha256
เป็นสตริง
http_archive = repository_rule(
implementation=_impl,
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
ทั้งหมดมีแอตทริบิวต์ name
ที่กำหนดไว้โดยนัย นี่คือแอตทริบิวต์สตริงที่ทำงานอย่างน่าอัศจรรย์ เมื่อระบุเป็นอินพุตในการเรียกใช้กฎของ repo ระบบจะใช้ชื่อ repo ที่ปรากฏ แต่เมื่ออ่านจากฟังก์ชันการใช้งานของกฎ repo โดยใช้ repository_ctx.attr.name
ระบบจะแสดงชื่อ repo ที่เป็น Canonical
ฟังก์ชันการใช้งาน
กฎของ repo แต่ละข้อต้องมีฟังก์ชัน implementation
ซึ่งมีตรรกะจริงของกฎและจะทำงานในขั้นตอนการโหลดอย่างเคร่งครัด
ฟังก์ชันนี้มีพารามิเตอร์อินพุต repository_ctx
เท่านั้น ฟังก์ชันจะแสดงผล None
เพื่อระบุว่าสร้างกฎซ้ำได้โดยใช้พารามิเตอร์ที่ระบุ หรือแสดงผล Dict ที่มีชุดพารามิเตอร์สําหรับกฎที่จะเปลี่ยนกฎนั้นให้สร้างซ้ำได้ซึ่งจะสร้าง repo เดียวกัน ตัวอย่างเช่น สำหรับกฎที่ติดตามที่เก็บ Git ซึ่งนั่นหมายถึงการส่งคืนตัวระบุคอมมิตที่เจาะจงแทนที่จะเป็น Branch แบบลอยที่มีการระบุไว้แต่แรก
พารามิเตอร์อินพุต repository_ctx
ใช้เพื่อเข้าถึงค่าแอตทริบิวต์และฟังก์ชันที่ไม่ใช่แบบปิด (การค้นหาไบนารี การดำเนินการไบนารี การสร้างไฟล์ในที่เก็บ หรือการดาวน์โหลดไฟล์จากอินเทอร์เน็ต) ได้ ดูบริบทเพิ่มเติมได้ในเอกสารประกอบของ API ตัวอย่าง
def _impl(repository_ctx):
repository_ctx.symlink(repository_ctx.attr.path, "")
local_repository = repository_rule(
implementation=_impl,
...)
ฟังก์ชันการติดตั้งใช้งานจะทํางานเมื่อใด
ระบบจะเรียกใช้ฟังก์ชันการใช้งานของกฎรีโปเมื่อ Bazel ต้องการเป้าหมายจากรีโปนั้น เช่น เมื่อเป้าหมายอื่น (ในรีโปอื่น) ขึ้นอยู่กับเป้าหมายนั้น หรือมีการกล่าวถึงเป้าหมายนั้นในบรรทัดคำสั่ง ฟังก์ชันการใช้งานก็จะต้องสร้างที่เก็บในระบบไฟล์ วิธีนี้เรียกว่า "การดึงข้อมูล" ที่เก็บ
ซึ่งแตกต่างจากเป้าหมายปกติตรงที่ไม่จำเป็นต้องดึงข้อมูลรีโปอีกครั้งเมื่อมีการเปลี่ยนแปลงที่อาจทําให้รีโปแตกต่างออกไป ทั้งนี้เพราะมีบางอย่างที่ Bazel ตรวจไม่พบการเปลี่ยนแปลง หรืออาจก่อให้เกิดค่าใช้จ่ายมากเกินไปในทุกบิลด์ (เช่น สิ่งที่ดึงมาจากเครือข่าย) ดังนั้น ระบบจะดึงข้อมูลรีพอยต์อีกครั้งก็ต่อเมื่อมีการเปลี่ยนแปลงอย่างใดอย่างหนึ่งต่อไปนี้
- แอตทริบิวต์ที่ส่งไปยังการเรียกใช้กฎของ repo
- โค้ด Starlark ที่ประกอบด้วยการใช้งานกฎของพื้นที่เก็บข้อมูล
- ค่าของตัวแปรสภาพแวดล้อมที่ส่งไปยังเมธอด
getenv()
ของrepository_ctx
หรือประกาศด้วยแอตทริบิวต์environ
ของrepository_rule
ค่าของตัวแปรสภาพแวดล้อมเหล่านี้สามารถกำหนดค่าในบรรทัดคำสั่งได้โดยใช้แฟล็ก--repo_env
- สถานะ เนื้อหา และประเภทของเส้นทางที่
watch
ในฟังก์ชันการใช้งานของกฎรีโป- วิธีอื่นๆ ของ
repository_ctx
ที่มีพารามิเตอร์watch
เช่นread()
,execute()
และextract()
ก็ทําให้ระบบดูเส้นทางได้เช่นกัน - ในทํานองเดียวกัน
repository_ctx.watch_tree
และpath.readdir
อาจทําให้ระบบติดตามเส้นทางด้วยวิธีอื่นๆ
- วิธีอื่นๆ ของ
- เมื่อมีการเรียกใช้
bazel fetch --force
repository_rule
มี 2 พารามิเตอร์ที่ควบคุมเวลาในการดึงข้อมูลพื้นที่เก็บข้อมูลอีกครั้ง ดังนี้
- หากตั้งค่าแฟล็ก
configure
ไว้ ระบบจะดึงข้อมูลที่เก็บอีกครั้งในbazel fetch --force --configure
(ระบบจะไม่ดึงข้อมูลที่เก็บที่ไม่ใช่configure
อีกครั้ง) - หากตั้งค่า Flag
local
ไว้ นอกเหนือจากกรณีที่ระบุไว้ข้างต้น ระบบจะดึงข้อมูลรีโปอีกครั้งเมื่อเซิร์ฟเวอร์ Bazel รีสตาร์ท
การบังคับให้ดึงข้อมูลรีโปภายนอกอีกครั้ง
บางครั้งที่เก็บภายนอกอาจล้าสมัยโดยไม่มีการเปลี่ยนแปลงคำจำกัดความหรือทรัพยากร Dependency เลย ตัวอย่างเช่น รีโปที่ดึงข้อมูลแหล่งที่มาอาจติดตามสาขาที่เฉพาะเจาะจงของที่เก็บข้อมูลของบุคคลที่สาม และคอมมิตใหม่จะอยู่ในสาขานั้น ในกรณีนี้ คุณขอให้ bazel ดึงข้อมูลที่เก็บภายนอกทั้งหมดอีกครั้งอย่างไม่มีเงื่อนไขได้โดยโทรหา bazel fetch --force --all
นอกจากนี้ กฎของรีโปบางรายการจะตรวจสอบเครื่องในเครื่องและอาจล้าสมัยหากมีการอัปเกรดเครื่องในเครื่อง คุณสามารถขอให้ Bazel ดึงข้อมูลเฉพาะที่เก็บภายนอกได้เมื่อคำจำกัดความ repository_rule
มีชุดแอตทริบิวต์ configure
ให้ใช้ bazel fetch --force
--configure
ตัวอย่าง
เครื่องมือทางเทคนิคที่กําหนดค่า C++ โดยอัตโนมัติ: ใช้กฎของพื้นที่เก็บข้อมูลเพื่อสร้างไฟล์การกําหนดค่า C++ สําหรับ Bazel โดยอัตโนมัติโดยมองหาคอมไพเลอร์ C++ ในพื้นที่ สภาพแวดล้อม และ Flag ที่คอมไพเลอร์ C++ รองรับ
ที่เก็บ Go ใช้
repository_rule
หลายรายการเพื่อกำหนดรายการของ Dependency ที่จำเป็นต้องใช้กฎ Gorules_jvm_external จะสร้างที่เก็บข้อมูลภายนอกชื่อ
@maven
โดยค่าเริ่มต้น ซึ่งจะสร้างเป้าหมายการสร้างสำหรับอาร์ติแฟกต์ Maven ทั้งหมดในต้นไม้การพึ่งพาแบบทรานซิทีฟ