ภาพรวมส่วนขยาย

หน้านี้อธิบายวิธีขยายภาษา BUILD โดยใช้มาโครและกฎ

ส่วนขยายของ Bazel คือไฟล์ที่ลงท้ายด้วย .bzl ใช้คำสั่ง load เพื่อนำเข้าสัญลักษณ์จากส่วนขยาย

ก่อนที่จะเรียนรู้แนวคิดที่ซับซ้อนมากขึ้น ให้ทำดังนี้ก่อน

  • อ่านเกี่ยวกับภาษา Starlark ที่ใช้ในไฟล์ BUILD และ .bzl

  • ดูวิธีแชร์ตัวแปร ระหว่างไฟล์ BUILD 2 ไฟล์

มาโครและกฎ

มาโครคือฟังก์ชันที่สร้างอินสแตนซ์ของกฎ ซึ่งมีประโยชน์เมื่อไฟล์ 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()) แล้วเท่านั้น การโหลดไฟล์ .bzl จะไม่มีผลข้างเคียงที่มองเห็นได้ โดยจะกำหนดค่าและฟังก์ชันเท่านั้น

Bazel พยายามทำงานอย่างชาญฉลาด โดยใช้การวิเคราะห์การขึ้นต่อกันเพื่อดูว่าต้องโหลดไฟล์ใด ต้องวิเคราะห์กฎใด และต้องดำเนินการใด ตัวอย่างเช่น หากกฎสร้างการดำเนินการที่คุณไม่จำเป็นต้องใช้สำหรับการบิลด์ปัจจุบัน ระบบจะไม่ดำเนินการ

การสร้างส่วนขยาย

ลิงก์ 2 ลิงก์ด้านล่างจะมีประโยชน์มากเมื่อเขียนส่วนขยายของคุณเอง เก็บลิงก์ไว้ใกล้มือ

เจาะลึกยิ่งขึ้น

นอกเหนือจาก มาโคร และ กฎ คุณอาจต้องการเขียน แง่มุม และ กฎของที่เก็บ