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

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

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

ก่อนที่จะเรียนรู้แนวคิดที่ซับซ้อนมากขึ้น ให้ทำดังนี้ก่อน

  • อ่านเกี่ยวกับภาษา Starlark ที่ใช้ในไฟล์ BUILD และ .bzl

  • ดูวิธีแชร์ตัวแปร ระหว่างไฟล์ BUILD 2 ไฟล์

มาโครและกฎ

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

การสร้างส่วนขยาย

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

ไปต่อ

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