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