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

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

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

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

ก่อนที่จะเรียนรู้แนวคิดขั้นสูงขึ้น ก่อนอื่น

มาโครและกฎ

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

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

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

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

บิลด์จะประกอบด้วย 3 เฟส

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

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

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

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

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

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

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

ก้าวต่อไป

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