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

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

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

ก่อนที่จะเรียนรู้แนวคิดขั้นสูงเพิ่มเติม ให้ทำดังนี้

มาโครและกฎ

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

ก้าวข้ามขีดจำกัดเดิมๆ

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