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

รายงานปัญหา ดูแหล่งที่มา รุ่น Nightly · 7.4 7.3 · 7.2 · 7.1 · 7.0 · 6.5

หน้านี้อธิบายวิธีขยายภาษา 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() statement) ของไฟล์แล้ว การออกแบบการโหลดไฟล์ .bzl จะไม่มีผลข้างเคียงที่มองเห็นได้ แต่จะกําหนดค่าและฟังก์ชันเท่านั้น

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

การสร้างชิ้นงาน

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

การดำเนินการต่อ

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