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

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

หน้านี้อธิบายวิธีขยายภาษา 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 รายการด้านล่างจะมีประโยชน์อย่างยิ่งเมื่อคุณเขียนส่วนขยายของคุณเอง เก็บ ไว้ใกล้มือ

ไปต่อ

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