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

รายงานปัญหา ดูแหล่งที่มา ตอนกลางคืน · 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 ) และการดำเนินการจะได้รับการสร้างอินสแตนซ์ การดำเนินการอธิบายวิธีสร้าง ชุดเอาต์พุตจากชุดอินพุต เช่น "run gcc ใน Hello.c และ get Hello.o" คุณต้องระบุรายการอย่างชัดเจนว่าจะสร้างไฟล์ใดก่อน กำลังดำเนินการตามคำสั่งจริง กล่าวคือ ขั้นตอนการวิเคราะห์จะใช้เวลา กราฟที่สร้างขึ้นจากระยะการโหลดและสร้างกราฟการดำเนินการ

  • ระยะดำเนินการ จะมีการดำเนินการต่างๆ เมื่อเอาต์พุตอย่างน้อย 1 รายการเป็น ต้องระบุ หากไฟล์หายไปหรือหากคำสั่งสร้างเอาต์พุตไม่สำเร็จ การสร้างล้มเหลว โดยจะมีการทดสอบในระยะนี้ด้วย

Bazel ใช้การทำงานพร้อมกันเพื่ออ่าน แยกวิเคราะห์ และประเมินไฟล์ .bzl และ BUILD มีการอ่านไฟล์มากที่สุด 1 ครั้งต่อบิลด์ และผลของการประเมินคือ ที่แคชและนำมาใช้ใหม่ ระบบจะประเมินไฟล์ครั้งเดียวสำหรับทรัพยากร Dependency ทั้งหมด (load()) เท่านั้น ) ได้รับการแก้ไขแล้ว ระบบออกแบบมาให้มองไม่เห็นการโหลดไฟล์ .bzl ผลข้างเคียง จะกำหนดค่าและฟังก์ชันเท่านั้น

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

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

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

ก้าวต่อไป

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