หน้านี้จะอธิบายวิธีสร้างกฎของที่เก็บและให้ตัวอย่างเพื่อดูรายละเอียดเพิ่มเติม
ที่เก็บข้อมูลภายนอกคือกฎที่ใช้ได้เฉพาะในไฟล์ WORKSPACE
และเปิดใช้การดำเนินการแบบไม่ปิดผนึกในระยะการโหลดของ Bazel กฎที่เก็บข้อมูลภายนอกแต่ละรายการจะสร้างพื้นที่ทํางานของตัวเอง โดยมีBUILD
ไฟล์และอาร์ติแฟกต์ของตัวเอง ใช้เพื่อพึ่งพาบุคคลที่สาม
ไลบรารี (เช่น ไลบรารีแพ็กเกจ Maven) และสร้าง BUILD
ไฟล์ด้วย
ที่เฉพาะโฮสต์ Bazel กำลังทำงานอยู่
การสร้างกฎที่เก็บ
ในไฟล์ .bzl
ให้ใช้เมธอด
repository_rule เพื่อสร้างใหม่
และจัดเก็บไว้ในตัวแปรร่วม
คุณใช้กฎที่เก็บข้อมูลที่กำหนดเองได้เช่นเดียวกับกฎที่เก็บข้อมูลเดิม ทั้งนี้
มีแอตทริบิวต์ name
ที่จำเป็นและทุกเป้าหมายมีอยู่ในไฟล์บิลด์
อาจเรียกว่า @<name>//package:target
โดยที่ <name>
คือค่าของ
name
ระบบจะโหลดกฎเมื่อคุณสร้างกฎอย่างชัดเจน หรือในกรณีที่กฎเป็นข้อกำหนดของบิลด์ ในกรณีนี้ Bazel จะเรียกใช้ฟังก์ชัน implementation
ฟังก์ชันนี้จะอธิบายวิธีสร้างที่เก็บข้อมูล เนื้อหา และไฟล์ BUILD
Attributes
แอตทริบิวต์คืออาร์กิวเมนต์กฎที่ส่งผ่านเป็นพจนานุกรมไปยังอาร์กิวเมนต์กฎ attrs
แอตทริบิวต์และประเภทของแอตทริบิวต์จะถูกระบุไว้เมื่อคุณกำหนด
กฎที่เก็บ ตัวอย่างการกำหนดแอตทริบิวต์ url
และ sha256
เป็น
strings:
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
เพียง 1 รายการ ฟังก์ชันจะแสดงผล None
เพื่อระบุว่าสร้างกฎซ้ำได้โดยใช้พารามิเตอร์ที่ระบุ หรือจะแสดงผลเป็น Dict ที่มีชุดพารามิเตอร์สําหรับกฎนั้น ซึ่งจะเปลี่ยนกฎนั้นให้สร้างซ้ำได้และสร้างที่เก็บเดียวกัน สำหรับ
ตัวอย่างเช่น สำหรับกฎที่ติดตามที่เก็บ 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 ประกอบด้วยการใช้งานที่เก็บ
- ค่าของตัวแปรสภาพแวดล้อมที่ส่งไปยังของ
repository_ctx
getenv()
หรือประกาศด้วยแอตทริบิวต์environ
ของrepository_rule
ค่าของตัวแปรสภาพแวดล้อมเหล่านี้สามารถกำหนดค่าแบบฮาร์ดแวร์ในบรรทัดคำสั่งได้โดยใช้แฟล็ก--repo_env
- เนื้อหาของไฟล์ที่ส่งไปยัง
read()
,execute()
และเมธอดที่คล้ายกันของrepository_ctx
ซึ่งอ้างอิงโดยป้ายกำกับ (เช่น//mypkg:label.txt
แต่ไม่ใช่mypkg/label.txt
) - เมื่อมีการเรียกใช้
bazel sync
repository_rule
มี 2 พารามิเตอร์ที่ควบคุมเวลาในการดึงข้อมูลรีโพซิทอรี่อีกครั้ง ดังนี้
- หากตั้งค่าแฟล็ก
configure
ไว้ ระบบจะดึงข้อมูลที่เก็บอีกครั้งเฉพาะในbazel sync
เมื่อมีการส่งพารามิเตอร์--configure
(หากพารามิเตอร์ ไม่ได้ตั้งค่า คำสั่งนี้จะไม่ทำให้มีการเรียกโฆษณาซ้ำ) หากตั้งค่าแฟล็ก
local
ไว้นอกเหนือกรณีข้างต้น ที่เก็บจะ จะดึงข้อมูลอีกครั้งเมื่อเซิร์ฟเวอร์ Bazel รีสตาร์ท หรือเมื่อไฟล์ที่ได้รับผลกระทบ การประกาศการเปลี่ยนแปลงที่เก็บ (เช่น ไฟล์WORKSPACE
หรือไฟล์ จะโหลด) ไม่ว่าการเปลี่ยนแปลงนั้นจะทำให้เกิดการเปลี่ยนแปลง การประกาศที่เก็บหรือโค้ดของที่เก็บระบบจะไม่ดึงข้อมูลรีโพซิทอรีที่ไม่ใช่ในเครื่องอีกครั้งในกรณีเหล่านี้ เนื่องจากระบบจะถือว่าที่เก็บเหล่านี้สื่อสารกับเครือข่ายหรือมีราคาแพง
การเริ่มฟังก์ชันการติดตั้งใช้งานอีกครั้ง
ฟังก์ชันการใช้งานจะเริ่มต้นใหม่ได้ขณะที่ดึงข้อมูลรีโพซิทอรี่ หากไม่มีทรัพยากร 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 ทั้งหมดในต้นไม้การพึ่งพาแบบทรานซิทีฟ