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

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

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

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

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

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

มาโครและกฎ

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

ไปต่อ

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