คุณสามารถเรียกใช้ Bazel จากสคริปต์เพื่อทำการบิลด์ เรียกใช้การทดสอบ หรือค้นหากราฟความเกี่ยวข้องได้ Bazel ได้รับการออกแบบมาเพื่อให้สคริปต์มีประสิทธิภาพ แต่ส่วนนี้จะแสดงรายละเอียดบางอย่างที่ควรคำนึงถึงเพื่อให้สคริปต์มีประสิทธิภาพมากขึ้น
การเลือกฐานของเอาต์พุต
ตัวเลือก --output_base
จะควบคุมตำแหน่งที่กระบวนการ Bazel ควรเขียนเอาต์พุตของบิลด์ รวมถึงไฟล์ทํางานต่างๆ ที่ Bazel ใช้ภายใน ซึ่งหนึ่งในนั้นคือล็อกที่ช่วยป้องกันการเปลี่ยนแปลงฐานเอาต์พุตพร้อมกันโดยกระบวนการ Bazel หลายรายการ
การเลือกไดเรกทอรีฐานเอาต์พุตที่ถูกต้องสำหรับสคริปต์จะขึ้นอยู่กับหลายปัจจัย หากต้องการวางเอาต์พุตการสร้างในตำแหน่งที่เจาะจง ตัวเลือกนี้จะกำหนดฐานเอาต์พุตที่คุณต้องใช้งาน หากคุณทำการเรียกแบบ "อ่านอย่างเดียว" ไปยัง Bazel (เช่น bazel query
) ปัจจัยในการล็อกจะมีความสำคัญมากกว่า โดยเฉพาะอย่างยิ่ง หากต้องการเรียกใช้อินสแตนซ์สคริปต์หลายรายการพร้อมกัน คุณจะต้องกำหนดฐานเอาต์พุตที่แตกต่างกัน (หรือแบบสุ่ม) ให้กับแต่ละรายการ
หากใช้ค่าฐานเอาต์พุตเริ่มต้น คุณจะแย่งสิทธิ์ใช้ล็อกเดียวกันกับที่ใช้โดยคำสั่ง Bazel แบบอินเทอร์แอกทีฟของผู้ใช้ หากผู้ใช้ส่งคําสั่งที่ใช้เวลานาน เช่น บิลด์ สคริปต์ของคุณจะต้องรอให้คําสั่งเหล่านั้นเสร็จสมบูรณ์ก่อนจึงจะดําเนินการต่อได้
หมายเหตุเกี่ยวกับโหมดเซิร์ฟเวอร์
โดยค่าเริ่มต้น Bazel จะใช้กระบวนการเซิร์ฟเวอร์ที่ทำงานอยู่นานเพื่อเพิ่มประสิทธิภาพ เมื่อเรียกใช้ Bazel ในสคริปต์ อย่าลืมเรียกใช้ shutdown
เมื่อคุณใช้เซิร์ฟเวอร์เสร็จแล้ว หรือระบุ --max_idle_secs=5
เพื่อให้เซิร์ฟเวอร์ที่ไม่ได้ใช้งานปิดตัวเองโดยทันที
ฉันจะได้รับรหัสออกใด
Bazel พยายามแยกแยะความล้มเหลวเนื่องจากซอร์สโค้ดอยู่ระหว่างการพิจารณาจากข้อผิดพลาดภายนอกที่ทำให้ Bazel ทำงานอย่างไม่ถูกต้อง การดำเนินการกับ Bazel อาจทำให้เกิดรหัสออกต่อไปนี้
รหัสออกที่ใช้ได้กับทุกคำสั่ง:
0
- สำเร็จ2
- ปัญหาเกี่ยวกับบรรทัดคำสั่ง แฟล็กหรือชุดคำสั่งที่ไม่ถูกต้องหรือผิดกฎหมาย หรือตัวแปรสภาพแวดล้อมที่ไม่ถูกต้อง คุณต้องแก้ไขบรรทัดคำสั่ง8
- การสร้างถูกขัดจังหวะ แต่เราสิ้นสุดด้วยระบบปิดอย่างเป็นระเบียบ9
- การล็อกเซิร์ฟเวอร์ถูกระงับและผ่าน--noblock_for_lock
32
- สภาพแวดล้อมภายนอกไม่ทำงานในเครื่องนี้33
- Bazel ใช้หน่วยความจําหมดและขัดข้อง คุณต้องแก้ไขบรรทัดคำสั่ง34
- สงวนไว้สำหรับการใช้งานภายในของ Google35
- สงวนไว้สำหรับการใช้งานภายในของ Google36
- ปัญหาสิ่งแวดล้อมในท้องถิ่น อาจเป็นไปได้ว่าคงอยู่ถาวร37
- ข้อยกเว้นที่ไม่มีการจัดการ / ข้อผิดพลาดภายใน Bazel38
- สงวนไว้สำหรับการใช้งานภายในของ Google41-44
- สงวนไว้สำหรับการใช้งานภายในของ Google45
- เกิดข้อผิดพลาดในการเผยแพร่ผลลัพธ์ไปยังบริการ Build Event47
- สงวนไว้สำหรับการใช้งานภายในของ Google
รหัสผลลัพธ์สำหรับคำสั่ง bazel build
, bazel test
:
1
- การสร้างไม่สำเร็จ3
- บิลด์สำเร็จ แต่การทดสอบบางรายการล้มเหลวหรือหมดเวลา4
- บิลด์สําเร็จ แต่ไม่พบการทดสอบแม้ว่าจะมีการขอการทดสอบแล้วก็ตาม
สำหรับ bazel run
:
1
- การสร้างไม่สำเร็จ- หากบิลด์สำเร็จ แต่กระบวนการย่อยที่ดำเนินการแสดงโค้ดสำหรับออกที่ไม่ใช่ 0 โค้ดนั้นก็จะเป็นโค้ดสำหรับออกของคำสั่งเช่นกัน
สำหรับ bazel query
:
3
- ดำเนินการสำเร็จบางส่วน แต่การค้นหาพบข้อผิดพลาดอย่างน้อย 1 ข้อในชุดไฟล์ BUILD อินพุต ดังนั้นผลลัพธ์ของการดำเนินการจึงไม่น่าเชื่อถือ 100% ซึ่งอาจเกิดจากตัวเลือก--keep_going
ในบรรทัดคำสั่ง7
- คำสั่งไม่สำเร็จ
เวอร์ชัน Bazel ในอนาคตอาจเพิ่มรหัสทางออกเพิ่มเติม โดยแทนที่รหัสการออกล้มเหลวทั่วไป 1
ด้วยค่าอื่นที่ไม่ใช่ 0 ด้วยความหมายเฉพาะ
อย่างไรก็ตาม ค่าที่ออกทั้งหมดที่ไม่ใช่ 0 จะกลายเป็นข้อผิดพลาดเสมอ
การอ่านไฟล์ .bazelrc
โดยค่าเริ่มต้น Bazel จะอ่านไฟล์ .bazelrc
จากไดเรกทอรีฐานของที่ทำงานหรือไดเรกทอรีหลักของผู้ใช้ การดำเนินการนี้เป็นสิ่งที่ควรทำหรือไม่นั้นขึ้นอยู่กับสคริปต์ของคุณ หากสคริปต์ต้องปิดผนึกอย่างสมบูรณ์ (เช่น เมื่อทำการบิลด์รุ่น) คุณควรปิดใช้การอ่านไฟล์ .bazelrc โดยใช้ตัวเลือก --bazelrc=/dev/null
หากต้องการสร้างโดยใช้การตั้งค่าที่ผู้ใช้ต้องการ คุณควรใช้ลักษณะการทำงานเริ่มต้น
บันทึกคำสั่ง
เอาต์พุต Bazel ยังอยู่ในไฟล์บันทึกคําสั่งด้วย ซึ่งคุณดูได้ด้วยคําสั่งต่อไปนี้
bazel info command_log
ไฟล์บันทึกคำสั่งจะมีสตรีม stdout และ stderr ที่ซ้อนกันของคำสั่ง Bazel ล่าสุด โปรดทราบว่าการเรียกใช้ bazel info
จะเขียนทับเนื้อหาของไฟล์นี้ เนื่องจากจะกลายเป็นคำสั่ง Bazel ล่าสุด
อย่างไรก็ตาม ตำแหน่งของไฟล์บันทึกคําสั่งจะไม่เปลี่ยนแปลง เว้นแต่คุณจะเปลี่ยนการตั้งค่าตัวเลือก --output_base
หรือ --output_user_root
เอาต์พุตการแยกวิเคราะห์
เอาต์พุต Bazel ค่อนข้างง่ายในการแยกวิเคราะห์เพื่อวัตถุประสงค์หลายอย่าง ตัวเลือก 2 รายการที่อาจเป็นประโยชน์สำหรับสคริปต์ของคุณคือ --noshow_progress
ซึ่งจะระงับข้อความความคืบหน้า และ --show_result n
ซึ่งจะควบคุมว่าจะพิมพ์ข้อความ "สร้างข้อมูลล่าสุด" หรือไม่ ข้อความเหล่านี้อาจได้รับการแยกวิเคราะห์เพื่อดูว่าเป้าหมายใดสร้างสำเร็จ และตำแหน่งของไฟล์เอาต์พุตที่สร้างขึ้น อย่าลืมระบุค่า n ที่ใหญ่มากหากคุณใช้ข้อความเหล่านี้
การแก้ปัญหาประสิทธิภาพด้วยการสร้างโปรไฟล์
ดูที่ส่วนการวัดประสิทธิภาพ