หากมีข้อสงสัยหรือต้องการรับการสนับสนุน โปรดดูการขอรับความช่วยเหลือ
Bazel คืออะไร
Bazel เป็นเครื่องมือที่ทำให้การสร้างและทดสอบซอฟต์แวร์เป็นแบบอัตโนมัติ งานบิลด์ที่รองรับ รวมถึงการเรียกใช้คอมไพเลอร์และลิงเกอร์เพื่อสร้างโปรแกรมที่เรียกใช้งานได้และ ไลบรารี รวมถึงการประกอบแพ็กเกจที่พร้อมใช้งานสำหรับ Android, iOS และสภาพแวดล้อมเป้าหมายอื่นๆ Bazel คล้ายกับเครื่องมืออื่นๆ เช่น Make, Ant, Gradle, Buck, Pants และ Maven
Bazel มีอะไรพิเศษ
Bazel ออกแบบมาให้เหมาะกับวิธีพัฒนาซอฟต์แวร์ที่ Google โดยมี ฟีเจอร์ต่อไปนี้
- การรองรับหลายภาษา: Bazel รองรับหลายภาษา และขยายการรองรับภาษาโปรแกรมต่างๆ ได้
- ภาษาบิลด์ระดับสูง: โปรเจ็กต์จะอธิบายใน
BUILD
ซึ่งเป็นรูปแบบข้อความที่กระชับซึ่งอธิบายโปรเจ็กต์เป็นชุดของไลบรารี ไบนารี และการทดสอบขนาดเล็กที่เชื่อมต่อกัน ในทางตรงกันข้าม หากใช้เครื่องมืออย่าง Make คุณจะต้อง อธิบายไฟล์แต่ละไฟล์และการเรียกใช้คอมไพเลอร์ - การรองรับหลายแพลตฟอร์ม: คุณสามารถใช้เครื่องมือและไฟล์
BUILD
เดียวกันเพื่อ สร้างซอฟต์แวร์สำหรับสถาปัตยกรรมที่แตกต่างกัน และแม้แต่แพลตฟอร์มที่แตกต่างกัน ที่ Google เราใช้ Bazel เพื่อสร้างทุกอย่างตั้งแต่แอปพลิเคชันเซิร์ฟเวอร์ที่ทำงานบนระบบในศูนย์ข้อมูลไปจนถึงแอปไคลเอ็นต์ที่ทำงานบนโทรศัพท์มือถือ - ความสามารถในการทำซ้ำ: ใน
BUILD
ไฟล์ ไลบรารี การทดสอบ และไบนารีแต่ละรายการต้องระบุ การอ้างอิงโดยตรงอย่างครบถ้วน Bazel ใช้ข้อมูลการขึ้นต่อกันนี้เพื่อ ทราบว่าต้องสร้างใหม่เมื่อใดที่คุณทำการเปลี่ยนแปลงไฟล์ต้นฉบับ และงานใดที่ สามารถเรียกใช้แบบขนานได้ ซึ่งหมายความว่าการสร้างทั้งหมดจะเป็นแบบเพิ่มขึ้นและ จะให้ผลลัพธ์เดียวกันเสมอ - ปรับขนาดได้: Bazel สามารถจัดการบิลด์ขนาดใหญ่ได้ ที่ Google นั้น เซิร์ฟเวอร์ ไบนารีมักจะมีไฟล์ต้นฉบับ 100,000 ไฟล์ และบิลด์ที่ไม่มีการเปลี่ยนแปลงไฟล์จะใช้เวลาประมาณ 200 มิลลิวินาที
ทำไม Google ถึงไม่ใช้...
- Make, Ninja: เครื่องมือเหล่านี้ช่วยให้ควบคุมได้อย่างแม่นยำว่าคำสั่งใดจะเรียกใช้เพื่อสร้างไฟล์ แต่ผู้ใช้ต้องเป็นผู้เขียนกฎที่ถูกต้อง
- ผู้ใช้โต้ตอบกับ Bazel ในระดับที่สูงขึ้น ตัวอย่างเช่น Bazel มีกฎในตัวสำหรับ "การทดสอบ Java" "ไบนารี C++" และแนวคิดต่างๆ เช่น "แพลตฟอร์มเป้าหมาย" และ "แพลตฟอร์มโฮสต์" กฎเหล่านี้ได้รับการทดสอบอย่างเข้มงวดเพื่อให้มั่นใจว่าไม่มีข้อผิดพลาด
- Ant และ Maven: Ant และ Maven มุ่งเน้นที่ Java เป็นหลัก ในขณะที่ Bazel รองรับหลายภาษา Bazel สนับสนุนการแบ่งฐานของโค้ดออกเป็นหน่วยย่อยที่เล็กลง และนำกลับมาใช้ใหม่ได้ และสามารถสร้างเฉพาะหน่วยที่ต้องสร้างใหม่เท่านั้น ซึ่งจะช่วยเร่ง การพัฒนาเมื่อทำงานกับฐานของโค้ดขนาดใหญ่
- Gradle: ไฟล์กำหนดค่าของ Bazel มีโครงสร้างมากกว่าของ Gradle มาก ซึ่งช่วยให้ Bazel เข้าใจได้อย่างชัดเจนว่าแต่ละการดำเนินการทำอะไร ซึ่งจะช่วยให้เกิดการทำงานแบบคู่ขนานมากขึ้นและทำซ้ำได้ดียิ่งขึ้น
- Pants, Buck: เครื่องมือทั้ง 2 อย่างนี้สร้างและพัฒนาโดยอดีตพนักงาน Google ที่ Twitter และ Foursquare และ Facebook ตามลำดับ แม้ว่าเครื่องมือเหล่านี้จะได้รับการออกแบบตาม Bazel แต่ชุดฟีเจอร์ของเครื่องมือเหล่านี้แตกต่างกัน จึงไม่สามารถใช้แทนกันได้
Bazel มาจากไหน
Bazel เป็นเครื่องมือที่ Google ใช้สร้างซอฟต์แวร์เซิร์ฟเวอร์ภายใน และได้ขยายการสร้างซอฟต์แวร์อื่นๆ ด้วย เช่น แอปบนอุปกรณ์เคลื่อนที่ (iOS, Android) ที่เชื่อมต่อกับเซิร์ฟเวอร์ของเรา
คุณเขียนเครื่องมือภายในใหม่เป็นโอเพนซอร์สไหม เป็นส้อมไหม
Bazel แชร์โค้ดส่วนใหญ่กับเครื่องมือภายใน และมีการใช้กฎของ Bazel สำหรับการสร้างหลายล้านรายการทุกวัน
ทำไม Google จึงสร้าง Bazel
เมื่อนานมาแล้ว Google สร้างซอฟต์แวร์โดยใช้ Makefiles ขนาดใหญ่ที่สร้างขึ้น ซึ่งส่งผลให้การสร้างช้าและไม่น่าเชื่อถือ และเริ่มส่งผลต่อประสิทธิภาพการทำงานของนักพัฒนาซอฟต์แวร์และความคล่องตัวของบริษัท Bazel เป็นวิธีแก้ปัญหาเหล่านี้
Bazel ต้องใช้คลัสเตอร์บิลด์ไหม
โดยค่าเริ่มต้น Bazel จะเรียกใช้การดำเนินการบิลด์ในเครื่อง อย่างไรก็ตาม Bazel ยังเชื่อมต่อกับคลัสเตอร์บิลด์ได้ด้วยเพื่อให้บิลด์และการทดสอบเร็วขึ้นไปอีก ดูรายละเอียดเพิ่มเติมได้ในเอกสารประกอบเกี่ยวกับการดำเนินการและการแคชระยะไกลและการแคชระยะไกล
กระบวนการพัฒนาของ Google ทำงานอย่างไร
สำหรับฐานโค้ดของเซิร์ฟเวอร์ เราใช้เวิร์กโฟลว์การพัฒนาต่อไปนี้
- โค้ดเซิร์ฟเวอร์ทั้งหมดของเราอยู่ในระบบควบคุมเวอร์ชันเดียวขนาดใหญ่
- ทุกคนสร้างซอฟต์แวร์ด้วย Bazel
- ทีมต่างๆ เป็นเจ้าของส่วนต่างๆ ของโครงสร้างแหล่งที่มา และทำให้คอมโพเนนต์ของตนพร้อมใช้งานเป็น
BUILD
เป้าหมาย - การแยกสาขาใช้เพื่อจัดการรุ่นเป็นหลัก ดังนั้นทุกคนจึงพัฒนาซอฟต์แวร์ที่รีวิชันล่าสุด
Bazel เป็นรากฐานของปรัชญานี้ เนื่องจาก Bazel กำหนดให้ระบุการขึ้นต่อกันทั้งหมดอย่างครบถ้วน เราจึงคาดการณ์ได้ว่าโปรแกรมและการทดสอบใดบ้างที่ได้รับผลกระทบจากการเปลี่ยนแปลง และตรวจสอบโปรแกรมและการทดสอบเหล่านั้นก่อนส่ง
ดูข้อมูลเบื้องหลังเพิ่มเติมเกี่ยวกับกระบวนการพัฒนาที่ Google ได้ในบล็อกเครื่องมือสำหรับวิศวกร
เหตุใดคุณจึงเปิดตัว Bazel
การสร้างซอฟต์แวร์ควรเป็นเรื่องง่ายและสนุก การสร้างที่ช้าและคาดเดาไม่ได้ทำให้การเขียนโปรแกรม หมดสนุก
เหตุใดฉันจึงควรใช้ Bazel
- Bazel อาจช่วยให้คุณสร้างได้เร็วขึ้นเนื่องจากสามารถคอมไพล์เฉพาะไฟล์ ที่ต้องคอมไพล์ใหม่ ในทำนองเดียวกัน ก็สามารถข้ามการทดสอบซ้ำที่ทราบว่าไม่มีการเปลี่ยนแปลงได้
- Bazel ให้ผลลัพธ์ที่แน่นอน ซึ่งจะช่วยขจัดความคลาดเคลื่อนระหว่างการสร้างแบบเพิ่ม และการสร้างใหม่ทั้งหมด แล็ปท็อปและระบบ CI เป็นต้น
- Bazel สามารถสร้างแอปไคลเอ็นต์และเซิร์ฟเวอร์ที่แตกต่างกันด้วยเครื่องมือเดียวกันจากเวิร์กสเปซเดียวกัน เช่น คุณสามารถเปลี่ยนโปรโตคอลไคลเอ็นต์/เซิร์ฟเวอร์ในการคอมมิตเดียว และทดสอบว่าแอปบนอุปกรณ์เคลื่อนที่ที่อัปเดตแล้วทํางานร่วมกับเซิร์ฟเวอร์ที่อัปเดตแล้วได้ โดยสร้างทั้ง 2 อย่างด้วยเครื่องมือเดียวกัน และรับประโยชน์ทั้งหมดที่กล่าวถึงข้างต้นของ Bazel
ฉันดูตัวอย่างได้ไหม
ได้ ดูตัวอย่างง่ายๆ หรืออ่านซอร์สโค้ดของ Bazel เพื่อดูตัวอย่างที่ซับซ้อนกว่านี้
Bazel เหมาะกับงานใดมากที่สุด
Bazel โดดเด่นในการสร้างและทดสอบโปรเจ็กต์ที่มีคุณสมบัติต่อไปนี้
- โปรเจ็กต์ที่มีโค้ดเบสขนาดใหญ่
- โปรเจ็กต์ที่เขียนในภาษาแบบคอมไพล์ (หลายภาษา)
- โปรเจ็กต์ที่ติดตั้งใช้งานในหลายแพลตฟอร์ม
- โปรเจ็กต์ที่มีการทดสอบอย่างครอบคลุม
ฉันจะเรียกใช้ Bazel ได้ที่ไหน
Bazel ทำงานบน Linux, macOS (OS X) และ Windows
การพอร์ตไปยังแพลตฟอร์ม UNIX อื่นๆ ควรทำได้ค่อนข้างง่าย ตราบใดที่ JDK พร้อมใช้งานสำหรับแพลตฟอร์มนั้น
ฉันไม่ควรใช้ Bazel สำหรับอะไร
- Bazel พยายามแคชอย่างชาญฉลาด ซึ่งหมายความว่าไม่เหมาะกับการเรียกใช้การดำเนินการบิลด์ที่มีเอาต์พุตที่ไม่ควรแคช ตัวอย่างเช่น ไม่ควรเรียกใช้ขั้นตอนต่อไปนี้จาก Bazel
- ขั้นตอนการรวบรวมที่ดึงข้อมูลจากอินเทอร์เน็ต
- ขั้นตอนการทดสอบที่เชื่อมต่อกับอินสแตนซ์ QA ของเว็บไซต์
- ขั้นตอนการติดตั้งใช้งานที่จะเปลี่ยนการกำหนดค่าระบบคลาวด์ของเว็บไซต์
- หากการสร้างประกอบด้วยขั้นตอนที่ยาวและต่อเนื่องกัน 2-3 ขั้นตอน Bazel อาจช่วยได้ไม่มากนัก คุณจะได้รับความเร็วมากขึ้นด้วยการแบ่งขั้นตอนที่ยาวออกเป็นเป้าหมายที่เล็กลงและแยกกัน ซึ่ง Bazel สามารถเรียกใช้แบบขนานได้
ชุดฟีเจอร์ของ Bazel มีความเสถียรเพียงใด
ฟีเจอร์หลัก (กฎ C++, Java และ Shell) มีการใช้งานอย่างกว้างขวางภายใน Google จึงได้รับการทดสอบอย่างละเอียดและมีการเปลี่ยนแปลงน้อยมาก ในทำนองเดียวกัน เราจะทดสอบ Bazel เวอร์ชันใหม่ กับเป้าหมายหลายแสนรายการทุกวันเพื่อค้นหา การถดถอย และเราจะเผยแพร่เวอร์ชันใหม่หลายครั้งในแต่ละเดือน
กล่าวโดยย่อคือ Bazel ควรทำงานได้ตามปกติ ยกเว้นฟีเจอร์ที่มีเครื่องหมายว่า "ทดลอง" การเปลี่ยนแปลงกฎที่ไม่ใช่กฎการทดสอบจะเข้ากันได้แบบย้อนหลัง ดูรายการสถานะการรองรับฟีเจอร์ที่ละเอียดยิ่งขึ้นได้ในเอกสารการสนับสนุน
ไบนารีของ Bazel มีความเสถียรเพียงใด
ภายใน Google เราดูแลให้ Bazel ไม่ค่อยขัดข้อง ซึ่งควร ใช้กับฐานของโค้ดโอเพนซอร์สของเราด้วย
ฉันจะเริ่มใช้ Bazel ได้อย่างไร
Docker แก้ปัญหาความสามารถในการทำซ้ำไม่ได้ใช่ไหม
Docker ช่วยให้คุณสร้างแซนด์บ็อกซ์ที่มีรุ่นระบบปฏิบัติการที่แน่นอนได้อย่างง่ายดาย เช่น Ubuntu 12.04, Fedora 21 ซึ่งจะช่วยแก้ปัญหาการทำซ้ำสำหรับสภาพแวดล้อมของระบบได้ นั่นคือ "ฉันต้องใช้ /usr/bin/c++ เวอร์ชันใด"
Docker ไม่ได้กล่าวถึงความสามารถในการทำซ้ำเกี่ยวกับการเปลี่ยนแปลงในซอร์สโค้ด การเรียกใช้ Make ด้วย Makefile ที่เขียนไม่สมบูรณ์ภายในคอนเทนเนอร์ Docker อาจยังคงให้ผลลัพธ์ที่คาดเดาไม่ได้
ภายใน Google เราจะตรวจสอบเครื่องมือในการควบคุมแหล่งที่มาเพื่อความสามารถในการทำซ้ำ ด้วยวิธีนี้ เราจึงสามารถตรวจสอบการเปลี่ยนแปลงเครื่องมือ ("อัปเกรด GCC เป็น 4.6.1") ด้วยกลไกเดียวกับการเปลี่ยนแปลงไลบรารีพื้นฐาน ("แก้ไขการตรวจสอบขอบเขตใน OpenSSL")
ฉันจะสร้างไบนารีสำหรับการติดตั้งใช้งานใน Docker ได้ไหม
Bazel ช่วยให้คุณสร้างไบนารีแบบลิงก์แบบคงที่แบบสแตนด์อโลนใน C/C++ และไฟล์ JAR แบบรวมทุกอย่างสำหรับ Java ได้ ซึ่งทำงานโดยมีส่วนที่ใช้อ้างอิงน้อยในระบบ UNIX ปกติ จึงติดตั้งภายในคอนเทนเนอร์ Docker ได้
Bazel มีรูปแบบการจัดโครงสร้างโปรแกรมที่ซับซ้อนมากขึ้น เช่น โปรแกรม Java ที่ใช้ชุดไฟล์ข้อมูล หรือเรียกใช้โปรแกรมอื่นเป็นกระบวนการย่อย คุณสามารถแพ็กเกจสภาพแวดล้อมดังกล่าวเป็นไฟล์เก็บถาวรแบบสแตนด์อโลน เพื่อให้สามารถ นำไปใช้ในระบบต่างๆ รวมถึงอิมเมจ Docker ได้
ฉันสร้างอิมเมจ Docker ด้วย Bazel ได้ไหม
ได้ คุณใช้กฎ Docker ของเราเพื่อสร้างอิมเมจ Docker ที่ทำซ้ำได้
Bazel จะทำให้บิลด์ของฉันทำซ้ำได้โดยอัตโนมัติไหม
สำหรับไบนารี Java และ C++ จะใช้ได้ หากคุณไม่เปลี่ยน Toolchain หากมีขั้นตอนการบิลด์ที่เกี่ยวข้องกับสูตรที่กำหนดเอง (เช่น การเรียกใช้ไบนารีผ่านสคริปต์เชลล์ภายในกฎ) คุณจะต้องระมัดระวังเป็นพิเศษดังนี้
- อย่าใช้การอ้างอิงที่ไม่ได้ประกาศ การดำเนินการในแซนด์บ็อกซ์ (–spawn_strategy=sandboxed ใน Linux เท่านั้น) จะช่วยค้นหาการขึ้นต่อกันที่ไม่ได้ประกาศ
- หลีกเลี่ยงการจัดเก็บการประทับเวลาและรหัสผู้ใช้ในไฟล์ที่สร้างขึ้น ไฟล์ ZIP และไฟล์ที่เก็บอื่นๆ มีแนวโน้มที่จะเกิดปัญหานี้เป็นพิเศษ
- หลีกเลี่ยงการเชื่อมต่อกับเครือข่าย การดำเนินการในแซนด์บ็อกซ์ก็ช่วยได้เช่นกัน
- หลีกเลี่ยงกระบวนการที่ใช้ตัวเลขสุ่ม โดยเฉพาะอย่างยิ่งการข้ามผ่านพจนานุกรมจะมีการสุ่มในภาษาโปรแกรมหลายภาษา
คุณมีรุ่นไบนารีไหม
ได้ คุณสามารถดูไบนารีรุ่นล่าสุดและอ่านนโยบายการเผยแพร่ของเราได้
ฉันใช้ Eclipse/IntelliJ/XCode Bazel ทำงานร่วมกับ IDE ได้อย่างไร
สำหรับ IntelliJ โปรดดูปลั๊กอิน IntelliJ ที่มี Bazel
สำหรับ XCode โปรดดู Tulsi
สำหรับ Eclipse ให้ดูปลั๊กอิน E4B
สำหรับ IDE อื่นๆ โปรดดูบล็อกโพสต์เกี่ยวกับวิธีการทำงานของปลั๊กอินเหล่านี้
ฉันใช้ Jenkins/CircleCI/TravisCI Bazel ทำงานร่วมกับระบบ CI ได้อย่างไร
Bazel จะแสดงรหัสทางออกที่ไม่ใช่ 0 หากการเรียกใช้บิลด์หรือการทดสอบล้มเหลว ซึ่งควรเพียงพอสำหรับการผสานรวม CI ขั้นพื้นฐาน เนื่องจาก Bazel ไม่จำเป็นต้องมีการสร้างที่สะอาดเพื่อให้ถูกต้อง ระบบ CI จึงไม่ควรได้รับการกำหนดค่าให้ล้างข้อมูลก่อนเริ่มการสร้าง/การทดสอบ
โปรดดูรายละเอียดเพิ่มเติมเกี่ยวกับรหัสออกในคู่มือผู้ใช้
เราคาดหวังฟีเจอร์ใดได้บ้างในอนาคตของ Bazel
ฉันใช้ Bazel สำหรับโปรเจ็กต์ INSERT LANGUAGE HERE ได้ไหม
Bazel ขยายได้ ทุกคนสามารถเพิ่มการรองรับภาษาใหม่ๆ ได้ รองรับหลายภาษา โปรดดูรายการคำแนะนำในสารานุกรมการสร้างและรายการที่ครอบคลุมมากขึ้นใน awesomebazel.com
หากต้องการพัฒนาส่วนขยายหรือดูวิธีการทำงานของส่วนขยาย โปรดดูเอกสารประกอบสำหรับการขยาย Bazel
ฉันจะร่วมสนับสนุนโค้ดของ Bazel ได้ไหม
เหตุใดจึงไม่พัฒนาทุกอย่างแบบเปิด
เรายังคงต้องปรับโครงสร้างอินเทอร์เฟซระหว่างโค้ดสาธารณะใน Bazel กับส่วนขยายภายในของเราอยู่บ่อยครั้ง ซึ่งทำให้การพัฒนาแบบเปิดทำได้ยาก
คุณเปิดซอร์ส Bazel เสร็จแล้วใช่ไหม
การเปิดซอร์ส Bazel ยังอยู่ระหว่างการดำเนินการ โดยเฉพาะอย่างยิ่ง เรายังคงดำเนินการเกี่ยวกับโอเพนซอร์สต่อไปนี้
- การทดสอบหน่วยและการทดสอบการผสานรวมหลายรายการ (ซึ่งจะช่วยให้การส่งแพตช์ง่ายขึ้น)
- การผสานรวม IDE อย่างเต็มรูปแบบ
นอกเหนือจากโค้ดแล้ว เรายังต้องการให้การตรวจสอบโค้ด การติดตามข้อบกพร่อง และการตัดสินใจด้านการออกแบบทั้งหมดเกิดขึ้นแบบสาธารณะ โดยมีชุมชน Bazel เข้ามาเกี่ยวข้องด้วย เรายังไม่พร้อมที่จะดำเนินการดังกล่าว ดังนั้นการเปลี่ยนแปลงบางอย่างจะปรากฏในที่เก็บ Bazel โดยไม่มีคำอธิบายที่ชัดเจน แม้จะไม่มีความโปร่งใส แต่เราก็ต้องการสนับสนุนนักพัฒนาแอปภายนอกและทำงานร่วมกัน ดังนั้นเราจึงเปิดโค้ด แม้ว่าการพัฒนาบางส่วนจะยังคงเกิดขึ้นภายใน Google โปรดแจ้งให้เราทราบหากมีสิ่งใดที่ไม่ชัดเจนหรือไม่สมเหตุสมผลเมื่อเราเปลี่ยนไปใช้โมเดลแบบเปิด
มีส่วนใดของ Bazel ที่จะไม่มีวันเป็นโอเพนซอร์สไหม
ได้ โค้ดเบสบางส่วนผสานรวมกับเทคโนโลยีเฉพาะของ Google หรือเรากำลังหาข้ออ้างในการกำจัดโค้ดเบส (หรืออาจเป็นการผสมผสานระหว่าง 2 อย่างนี้) โค้ดฐานส่วนนี้ไม่พร้อมให้บริการบน GitHub และอาจจะไม่มีวันพร้อมให้บริการ
ฉันจะติดต่อทีมได้อย่างไร
คุณติดต่อเราได้ที่ bazel-discuss@googlegroups.com
ฉันจะรายงานข้อบกพร่องได้ที่ใด
เปิดปัญหาใน GitHub
ทำไมในโค้ดเบสถึงมีคำว่า "Blaze"
นี่คือชื่อภายในของเครื่องมือ โปรดเรียก Blaze ว่า Bazel
เหตุใดโปรเจ็กต์อื่นๆ ของ Google (Android, Chrome) จึงใช้เครื่องมือบิลด์อื่นๆ
ก่อนที่จะเปิดตัวเวอร์ชันแรก (อัลฟ่า) Bazel ไม่พร้อมใช้งานภายนอก ดังนั้นโปรเจ็กต์โอเพนซอร์ส เช่น Chromium และ Android จึงไม่สามารถใช้งานได้ นอกจากนี้ การที่ เดิมทีไม่มีการรองรับ Windows ยังเป็นปัญหาในการสร้างแอปพลิเคชัน Windows เช่น Chrome เนื่องจากโปรเจ็กต์นี้มีการพัฒนาและมีความเสถียรมากขึ้น Android Open Source Project จึงอยู่ระหว่างการย้ายข้อมูลไปยัง Bazel
"Bazel" ออกเสียงอย่างไร
ออกเสียงเหมือนกับ "basil" (สมุนไพร) ในภาษาอังกฤษแบบสหรัฐอเมริกาว่า "เบ-ซิล" ซึ่งคล้องจองกับ "hazel" IPA: /ˈbeɪzˌəl/