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