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