0Pricing
Learn Rust Coding · บทเรียน

สร้างโค้ดด้วย 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. Protobuf และนิยามบริการ
  2. สร้างโค้ดด้วย tonic-build
  3. สร้างเซิร์ฟเวอร์ gRPC
  4. เรียกใช้จากไคลเอนต์ gRPC
← กลับไปที่ Learn Rust Coding