หน้านี้อธิบายวิธีขยายภาษา BUILD โดยใช้มาโคร และกฎ
ส่วนขยาย Bazel คือไฟล์ที่ลงท้ายด้วย .bzl
ใช้คำสั่งโหลดเพื่อนำเข้าสัญลักษณ์จากส่วนขยาย
ก่อนที่จะเรียนรู้แนวคิดขั้นสูงเพิ่มเติม ให้ทำดังนี้
อ่านเกี่ยวกับภาษา Starlark ที่ใช้ในทั้งไฟล์
BUILD
และ.bzl
ดูวิธีแชร์ตัวแปร ระหว่างไฟล์
BUILD
2 ไฟล์
มาโครและกฎ
มาโครคือฟังก์ชันที่สร้างอินสแตนซ์ของกฎ ซึ่งจะมีประโยชน์เมื่อไฟล์
BUILD
ซ้ำซ้อนหรือซับซ้อนเกินไป เนื่องจากจะช่วยให้คุณนำโค้ดบางส่วนกลับมาใช้ซ้ำได้
ระบบจะประเมินฟังก์ชันทันทีที่อ่านBUILD
ไฟล์ หลังจากประเมินไฟล์ BUILD
แล้ว Bazel จะมีข้อมูลเล็กน้อยเกี่ยวกับมาโคร หากมาโครสร้าง genrule
Bazel จะทํางานราวกับว่าคุณเขียน genrule
ด้วยเหตุนี้ bazel query
จะแสดงเฉพาะ genrule
ที่สร้างขึ้น
กฎมีประสิทธิภาพมากกว่ามาโคร โดยสามารถเข้าถึงส่วนประกอบภายในของ Bazel และควบคุมสิ่งที่เกิดขึ้นได้อย่างเต็มที่ เช่น อาจส่งข้อมูลไปยังกฎอื่นๆ
หากต้องการนำตรรกะอย่างง่ายมาใช้ซ้ำ ให้เริ่มต้นด้วยมาโคร หากมาโครมีความซับซ้อน คุณควรเปลี่ยนมาใช้กฎ โดยปกติแล้วการรองรับภาษาใหม่ จะทำผ่านกฎ กฎนี้มีไว้สำหรับผู้ใช้ขั้นสูง และผู้ใช้ส่วนใหญ่ จะไม่ต้องเขียนกฎเอง แต่จะโหลดและเรียกใช้กฎที่มีอยู่ เท่านั้น
โมเดลการประเมิน
บิลด์ประกอบด้วย 3 เฟส
ระยะการโหลด ก่อนอื่น ให้โหลดและประเมินส่วนขยายทั้งหมดและไฟล์
BUILD
ทั้งหมดที่จำเป็นสำหรับการสร้าง การดำเนินการของไฟล์BUILD
จะสร้างอินสแตนซ์ของกฎ (ทุกครั้งที่มีการเรียกใช้กฎ ระบบจะเพิ่มกฎลงในกราฟ) ระบบจะประเมินมาโครในส่วนนี้ระยะการวิเคราะห์ ระบบจะเรียกใช้โค้ดของกฎ (
implementation
ฟังก์ชัน) และสร้างอินสแตนซ์ของการดำเนินการ การดำเนินการอธิบายวิธีสร้าง ชุดเอาต์พุตจากชุดอินพุต เช่น "เรียกใช้ gcc ใน hello.c และรับ hello.o" คุณต้องระบุอย่างชัดเจนว่าจะสร้างไฟล์ใดก่อน เรียกใช้คำสั่งจริง กล่าวคือ ระยะการวิเคราะห์จะใช้กราฟที่สร้างขึ้นในระยะการโหลดและสร้างกราฟการดำเนินการระยะดำเนินการ ระบบจะเรียกใช้การดำเนินการเมื่อต้องใช้เอาต์พุตอย่างน้อย 1 รายการ หากไม่มีไฟล์หรือคำสั่งสร้างเอาต์พุตไม่สำเร็จ บิลด์จะล้มเหลว นอกจากนี้ยังมีการทดสอบในช่วงนี้ด้วย
Bazel ใช้การประมวลผลแบบขนานเพื่ออ่าน แยกวิเคราะห์ และประเมินไฟล์ .bzl
และไฟล์ BUILD
ระบบจะอ่านไฟล์อย่างมาก 1 ครั้งต่อการสร้าง และจะแคชผลการประเมิน
และนำกลับมาใช้ใหม่ ระบบจะประเมินไฟล์ก็ต่อเมื่อแก้ไขการอ้างอิงทั้งหมด (load()
คำสั่ง) แล้วเท่านั้น การโหลดไฟล์ .bzl
จะไม่มีผลข้างเคียงที่มองเห็นได้ตามที่ออกแบบไว้ แต่จะกำหนดค่าและฟังก์ชันเท่านั้น
Bazel พยายามที่จะฉลาด โดยใช้การวิเคราะห์การขึ้นต่อกันเพื่อทราบว่าต้องโหลดไฟล์ใด ต้องวิเคราะห์กฎใด และต้องดำเนินการใด ตัวอย่างเช่น หากกฎสร้างการดำเนินการที่คุณไม่จำเป็นต้องใช้สำหรับการบิลด์ปัจจุบัน ระบบจะไม่ดำเนินการดังกล่าว
การสร้างส่วนขยาย
สร้างมาโครแรกเพื่อ นำโค้ดบางส่วนกลับมาใช้ซ้ำ จากนั้นดูข้อมูลเพิ่มเติมเกี่ยวกับมาโครและ การใช้มาโครเพื่อสร้าง "คำกริยาที่กำหนดเอง"
ดูบทแนะนำเกี่ยวกับกฎเพื่อเริ่มต้นใช้งานกฎ จากนั้นคุณสามารถอ่านเพิ่มเติมเกี่ยวกับแนวคิดของกฎ
ลิงก์ 2 รายการด้านล่างจะมีประโยชน์อย่างยิ่งเมื่อคุณเขียนส่วนขยายของคุณเอง เก็บ ไว้ใกล้มือ
ไปต่อ
นอกจากมาโครและกฎแล้ว คุณอาจต้องเขียน แง่มุมและกฎของที่เก็บ
ใช้ Buildifier อย่างสม่ำเสมอเพื่อจัดรูปแบบและตรวจสอบโค้ด
ปฏิบัติตาม
.bzl
คู่มือรูปแบบทดสอบโค้ด
สร้างเอกสารประกอบเพื่อช่วยเหลือผู้ใช้
เพิ่มประสิทธิภาพของโค้ด
ติดตั้งใช้งานส่วนขยายให้ผู้อื่น