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