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