สร้างโค้ดด้วย tonic-build
คอมไพล์ proto เป็น Rust
สร้างโค้ดด้วย tonic-build เป็นบทเรียน Learn Rust Coding ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Learn Rust Coding และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
tonic-build ทำอะไร
tonic-build ทำงานขณะคอมไพล์และแปลงไฟล์ .proto ของคุณเป็นซอร์สโค้ด Rust โดยครอบการทำงานของ prost-build สำหรับข้อความ และเพิ่มเทรตบริการ gRPC รวมถึงไคลเอ็นต์เข้าไป
โดยทำงานจากสคริปต์สร้างของ Cargo (build.rs) ดังนั้นการสร้างโค้ดจึงเกิดขึ้นโดยอัตโนมัติก่อนคอมไพล์เครตของคุณ
การพึ่งพา Cargo
คุณต้องใช้เครตขณะทำงานและเครตขณะสร้าง tonic และ prost เป็นการพึ่งพาปกติ ส่วน tonic-build ต้องอยู่ภายใต้ [build-dependencies]
tonic อาศัย tokio เป็นสภาพแวดล้อมรันแบบอะซิงโครนัส ดังนั้นให้เพิ่มสิ่งนี้ด้วย
[dependencies]
tonic = "0.12"
prost = "0.13"
tokio = { version = "1", features = ["full"] }
[build-dependencies]
tonic-build = "0.12"build.rs แบบเรียบง่าย
สร้าง build.rs ที่รากของเครต เรียก tonic_build::compile_protos พร้อมเส้นทางไปยังไฟล์ proto
โดยค่าเริ่มต้น ฟังก์ชันนี้จะคอมไพล์ทั้งโค้ดไคลเอ็นต์และเซิร์ฟเวอร์ แล้วเขียนลงใน OUT_DIR ของ Cargo
fn main() -> Result<(), Box<dyn std::error::Error>> {
tonic_build::compile_protos("proto/greeter.proto")?;
Ok(())
}การกำหนดค่าตัวสร้าง
หากต้องการควบคุมมากขึ้น ให้ใช้ tonic_build::configure() คุณสามารถปิดการสร้างไคลเอ็นต์หรือเซิร์ฟเวอร์ กำหนดเส้นทางเอาต์พุต หรือเพิ่มแอตทริบิวต์ชนิดได้
ในที่นี้เราจะสร้างเซิร์ฟเวอร์แต่ข้ามไคลเอ็นต์ ซึ่งมีประโยชน์สำหรับเครตแบ็กเอนด์ล้วน
tonic_build::configure()
.build_client(false)
.build_server(true)
.compile_protos(&["proto/greeter.proto"], &["proto"])?;เส้นทางรวม
อาร์กิวเมนต์ที่สองของ compile_protos คือรายการไดเรกทอรีที่จะรวม การนำเข้าภายใน proto เช่น google/protobuf/empty.proto จะได้รับการค้นหาโดยอ้างอิงจากรากเหล่านี้
โปรดรวมไดเรกทอรีที่มีไฟล์ proto ของคุณไว้เสมอ เพื่อให้การนำเข้าข้ามไฟล์ได้รับการแก้ไขอย่างถูกต้อง
tonic_build::configure()
.compile_protos(
&["proto/greeter.proto", "proto/health.proto"],
&["proto"],
)?;โค้ดถูกวางไว้ที่ใด
ไฟล์ที่สร้างขึ้นจะถูกเขียนลงในไดเรกทอรีตามตัวแปรสภาพแวดล้อม OUT_DIR โดยตั้งชื่อตามแพ็กเกจ proto เช่น greeter.v1.rs
คุณนำไฟล์เหล่านี้เข้ามาในเครตได้ด้วยมาโคร include_proto! ภายในโมดูล
pub mod greeter {
pub mod v1 {
tonic::include_proto!("greeter.v1");
}
}สิ่งที่ถูกสร้างขึ้น
สำหรับแต่ละบริการ tonic จะสร้างโมดูลเซิร์ฟเวอร์ที่มีเทรต เช่น greeter_server::Greeter และตัวห่อหุ้ม GreeterServer รวมถึงโครงสร้างไคลเอ็นต์ GreeterClient
ข้อความแต่ละรายการจะกลายเป็นโครงสร้าง Rust ที่อนุมาน Clone, PartialEq และ Message ของ prost
// generated (sketch):
// pub mod greeter_server { pub trait Greeter { /* methods */ } }
// pub mod greeter_client { pub struct GreeterClient<T> { /* ... */ } }การเพิ่ม Derive ด้วย type_attribute
บ่อยครั้งคุณอาจต้องการการอนุมานเพิ่มเติมบนโครงสร้างที่สร้างขึ้น เช่น serde::Serialize ให้ใช้ type_attribute เพื่อแทรกแอตทริบิวต์ลงในชนิดที่ระบุ หรือใส่ . เพื่อใช้กับทุกชนิด
วิธีนี้ทำให้ข้อความที่สร้างขึ้นสามารถส่งต่อไปยัง API ของ JSON หรือชุดข้อมูลสำหรับการทดสอบได้
tonic_build::configure()
.type_attribute(".", "#[derive(serde::Serialize)]")
.compile_protos(&["proto/greeter.proto"], &["proto"])?;การเรียกให้สร้างใหม่
Cargo จะเรียก build.rs ใหม่เฉพาะเมื่อเห็นว่าอินพุตเปลี่ยนแปลง ให้ส่งบรรทัด cargo:rerun-if-changed เพื่อให้การแก้ไขไฟล์ proto บังคับให้สร้างใหม่
หากไม่ทำเช่นนี้ proto ที่เปลี่ยนแปลงอาจยังไม่ถูกสร้างใหม่จนกว่าคุณจะปรับแก้ไฟล์ Rust
fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("cargo:rerun-if-changed=proto/greeter.proto");
tonic_build::compile_protos("proto/greeter.proto")?;
Ok(())
}ข้อกำหนด protoc
ในอดีต tonic-build เรียกคอมไพเลอร์ protoc จากภายนอก ซึ่งต้องติดตั้งไว้ ปัจจุบันสามารถใช้ตัวแยกวิเคราะห์ protox ที่เขียนด้วย Rust ล้วน เพื่อหลีกเลี่ยงการพึ่งพานี้ได้
หากพบข้อผิดพลาดว่าไม่พบ protoc ให้ติดตั้ง protoc หรือเปิดใช้คุณลักษณะคอมไพเลอร์ที่รวมมาในแพ็กเกจ
// In CI you may install protoc, e.g.:
// apt-get install -y protobuf-compilerชุดตัวบอกไฟล์
สำหรับการสะท้อนหรือเครื่องมือขั้นสูง ให้สั่ง tonic-build สร้างชุดตัวบอกไฟล์ด้วย file_descriptor_set_path
ไบต์ที่ได้สามารถส่งให้ tonic-reflection ทำให้เครื่องมืออย่าง grpcurl ค้นพบบริการของคุณขณะทำงานได้
tonic_build::configure()
.file_descriptor_set_path(
std::env::var("OUT_DIR").unwrap() + "/greeter.bin")
.compile_protos(&["proto/greeter.proto"], &["proto"])?;ตรวจสอบอย่างรวดเร็ว
โค้ด tonic ที่สร้างขึ้นจะไปอยู่ที่ใด และโหลดเข้ามาอย่างไร
สรุปทบทวน
คุณได้ตั้งค่าการพึ่งพา เขียน build.rs กำหนดค่าการสร้างไคลเอ็นต์และเซิร์ฟเวอร์กับเส้นทางรวม โหลดโค้ดผ่าน include_proto! เพิ่มการอนุมาน จัดการตัวกระตุ้นการสร้างใหม่ และเรียนรู้เกี่ยวกับ protoc กับชุดตัวบอกแล้ว
ถัดไป คุณจะนำเทรตเซิร์ฟเวอร์ที่ tonic สร้างขึ้นไปใช้งาน
คำถามที่พบบ่อย
บทเรียน “สร้างโค้ดด้วย tonic-build” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “สร้างโค้ดด้วย tonic-build” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Learn Rust Coding ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Learn Rust Coding มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “สร้างโค้ดด้วย tonic-build”
คอมไพล์ proto เป็น Rust คุณปฏิบัติ Learn Rust Coding ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Learn Rust Coding หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Learn Rust Coding บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “สร้างโค้ดด้วย tonic-build” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Learn Rust Coding นี้ได้ไหม
ได้ บทเรียน Learn Rust Coding ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Protobuf และนิยามบริการ
- สร้างโค้ดด้วย tonic-build
- สร้างเซิร์ฟเวอร์ gRPC
- เรียกใช้จากไคลเอนต์ gRPC