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

รายงานปัญหา ดูแหล่งที่มา

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

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

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

มาโครและกฎ

มาโครคือฟังก์ชันที่สร้างอินสแตนซ์ของกฎ ตัวเลือกนี้มีประโยชน์เมื่อไฟล์ BUILD มีความซ้ำหรือซับซ้อนเกินไป เนื่องจากจะทำให้คุณนำโค้ดบางอย่างไปใช้ซ้ำได้ ฟังก์ชันนี้จะได้รับการประเมินทันทีที่อ่านไฟล์ BUILD หลังจากประเมินไฟล์ BUILD แล้ว Bazel จะมีข้อมูลเกี่ยวกับมาโครเพียงเล็กน้อย หากมาโครของคุณสร้าง genrule แล้ว Bazel จะทำงานราวกับว่าคุณเขียน genrule ด้วยเหตุนี้ bazel query จึงจะแสดงเฉพาะรายการ genrule ที่สร้างขึ้น

กฎมีประสิทธิภาพมากกว่ามาโคร สามารถเข้าถึงระบบภายในของ Bazel และควบคุมสิ่งที่เกิดขึ้นได้อย่างเต็มรูปแบบ เช่น ส่งข้อมูลไปให้กฎอื่นๆ

หากต้องการนำตรรกะอย่างง่ายมาใช้ซ้ำ ให้เริ่มต้นด้วยมาโคร หากมาโครมีความซับซ้อน สิ่งที่ควรทำให้เป็นกฎ การรองรับภาษาใหม่ มักจะใช้กฎ กฎมีไว้สำหรับผู้ใช้ขั้นสูงและผู้ใช้ส่วนใหญ่ไม่จำเป็นต้องเขียนกฎ แต่จะโหลดเฉพาะและเรียกกฎที่มีอยู่เท่านั้น

โมเดลการประเมิน

บิลด์ประกอบด้วย 3 ขั้นตอน

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

  • ขั้นการวิเคราะห์ โค้ดของกฎจะทำงาน (ฟังก์ชัน implementation) และสร้างอินสแตนซ์การดำเนินการ การดำเนินการอธิบายวิธีสร้างชุดเอาต์พุตจากชุดอินพุต เช่น "run gcc ใน hello.c and get hello.o" คุณต้องระบุอย่างชัดเจนว่าจะสร้างไฟล์ใดก่อนเรียกใช้คำสั่งจริง กล่าวอีกนัยหนึ่งคือ ขั้นตอนการวิเคราะห์จะใช้กราฟที่สร้างโดยระยะการโหลดและสร้างกราฟการดำเนินการ

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

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

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

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

ลิงก์ทั้งสองด้านล่างนี้จะเป็นประโยชน์มากเมื่อคุณเขียนส่วนขยายของคุณเอง ทำให้ ผู้เข้าชมเข้าถึง:

ไปให้ไกลกว่านั้น

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