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

รายงานปัญหา ดูแหล่งที่มา Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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

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

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

มาโครและกฎ

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

ไปต่อ

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