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