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