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

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

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

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

การดำเนินการเพิ่มเติม

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