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

รายงานปัญหา ดูซอร์สโค้ด รุ่น Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

ก่อนเรียนรู้แนวคิดขั้นสูงเพิ่มเติม ให้ทำดังนี้

มาโครและกฎ

มาโครคือฟังก์ชันที่สร้างอินสแตนซ์ของกฎ มาโครมี 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() statement) เรียบร้อยแล้ว การออกแบบการโหลดไฟล์ .bzl จะไม่มีผลข้างเคียงที่มองเห็นได้ แต่จะกําหนดค่าและฟังก์ชันเท่านั้น

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

การสร้างชิ้นงาน

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

การดำเนินการเพิ่มเติม

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