หน้านี้อธิบายวิธีขยายภาษา BUILD โดยใช้มาโคร และกฎ
ส่วนขยาย Bazel คือไฟล์ที่ลงท้ายด้วย .bzl ใช้คำสั่งโหลดเพื่อนำเข้าสัญลักษณ์จากส่วนขยาย
ก่อนที่จะเรียนรู้แนวคิดขั้นสูงเพิ่มเติม ให้ทำดังนี้
อ่านเกี่ยวกับภาษา Starlark ที่ใช้ในทั้งไฟล์
BUILDและ.bzlดูวิธีแชร์ตัวแปร ระหว่างไฟล์
BUILD2 ไฟล์
มาโครและกฎ
มาโครคือฟังก์ชันที่สร้างอินสแตนซ์ของกฎ ซึ่งจะมีประโยชน์เมื่อ
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คู่มือรูปแบบทดสอบโค้ด
สร้างเอกสารประกอบเพื่อช่วยเหลือผู้ใช้
เพิ่มประสิทธิภาพของโค้ด
ติดตั้งใช้งานส่วนขยายให้ผู้อื่น