หน้านี้อธิบายวิธีขยายภาษา 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()
statement) เรียบร้อยแล้ว การออกแบบการโหลดไฟล์ .bzl
จะไม่มีผลข้างเคียงที่มองเห็นได้ แต่จะกําหนดค่าและฟังก์ชันเท่านั้น
Bazel พยายามทำงานอย่างชาญฉลาดโดยใช้การวิเคราะห์ Dependency เพื่อดูว่าต้องโหลดไฟล์ใด วิเคราะห์กฎใด และดำเนินการใด เช่น หากกฎสร้างการดำเนินการที่คุณไม่ต้องการสำหรับบิลด์ปัจจุบัน ระบบจะไม่ดำเนินการ
การสร้างชิ้นงาน
สร้างมาโครแรกเพื่อใช้โค้ดซ้ำ จากนั้นดูข้อมูลเพิ่มเติมเกี่ยวกับมาโครและการใช้มาโครเพื่อสร้าง "คำกริยาที่กำหนดเอง"
ทำตามบทแนะนำเกี่ยวกับกฎเพื่อเริ่มต้นใช้งานกฎ ถัดไป คุณสามารถอ่านเพิ่มเติมเกี่ยวกับแนวคิดของกฎ
ลิงก์ 2 รายการด้านล่างจะมีประโยชน์อย่างยิ่งเมื่อคุณเขียนส่วนขยายของคุณเอง เก็บอุปกรณ์เหล่านี้ไว้ใกล้มือ
การดำเนินการเพิ่มเติม
นอกจากมาโครและกฎแล้ว คุณอาจต้องเขียนแง่มุมและกฎของที่เก็บด้วย
ใช้ Buildifier อย่างต่อเนื่องเพื่อจัดรูปแบบและตรวจโค้ด
ปฏิบัติตามคู่มือสไตล์
.bzl
ทดสอบโค้ด
สร้างเอกสารประกอบเพื่อช่วยเหลือผู้ใช้
เพิ่มประสิทธิภาพโค้ด
ทำให้ผู้อื่นใช้งานส่วนขยายได้