0Pricing
Learn Rust Coding · Pelajaran

Membuat Kode dengan tonic-build

Kompilasi proto menjadi Rust.

Membuat Kode dengan tonic-build adalah pelajaran Learn Rust Coding gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar Learn Rust Coding, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus Learn Rust Coding mencakup 4 pelajaran total.

Fungsi tonic-build

tonic-build berjalan saat kompilasi dan mengubah berkas .proto Anda menjadi sumber Rust. tonic-build membungkus prost-build untuk pesan, lalu menambahkan trait layanan gRPC dan klien di atasnya.

Proses ini dijalankan melalui skrip build Cargo (build.rs), sehingga pembuatan kode berlangsung otomatis sebelum crate Anda dikompilasi.

Dependensi Cargo

Anda memerlukan crate saat runtime dan crate saat build. tonic dan prost merupakan dependensi biasa; tonic-build ditempatkan di bawah [build-dependencies].

tonic mengandalkan tokio sebagai runtime asinkronnya, jadi sertakan juga crate tersebut.

[dependencies]
tonic = "0.12"
prost = "0.13"
tokio = { version = "1", features = ["full"] }

[build-dependencies]
tonic-build = "0.12"

build.rs Minimal

Buat build.rs di akar crate. Panggil tonic_build::compile_protos dengan jalur ke berkas proto Anda.

Secara bawaan, proses ini mengompilasi kode klien dan server, lalu menuliskannya ke OUT_DIR milik Cargo.

fn main() -> Result<(), Box<dyn std::error::Error>> {
    tonic_build::compile_protos("proto/greeter.proto")?;
    Ok(())
}

Mengonfigurasi Builder

Untuk memperoleh kendali lebih besar, gunakan tonic_build::configure(). Anda dapat menonaktifkan pembuatan klien atau server, menetapkan jalur keluaran, atau menambahkan atribut tipe.

Di sini kita membuat server, tetapi melewati klien—berguna untuk crate backend murni.

tonic_build::configure()
    .build_client(false)
    .build_server(true)
    .compile_protos(&["proto/greeter.proto"], &["proto"])?;

Jalur Include

Argumen kedua untuk compile_protos adalah daftar direktori include. Impor di dalam proto Anda, seperti google/protobuf/empty.proto, dicari berdasarkan akar-akar direktori ini.

Selalu sertakan direktori yang berisi berkas proto Anda agar impor lintas berkas dapat ditemukan.

tonic_build::configure()
    .compile_protos(
        &["proto/greeter.proto", "proto/health.proto"],
        &["proto"],
    )?;

Lokasi Kode

Berkas yang dibuat ditulis ke direktori dalam variabel lingkungan OUT_DIR, dengan nama berdasarkan paket proto, misalnya greeter.v1.rs.

Anda memasukkannya ke crate dengan makro include_proto! di dalam sebuah modul.

pub mod greeter {
    pub mod v1 {
        tonic::include_proto!("greeter.v1");
    }
}

Kode yang Dibuat

Untuk setiap layanan, tonic menghasilkan modul server dengan sebuah trait (misalnya greeter_server::Greeter) dan pembungkus GreeterServer, serta struct klien GreeterClient.

Setiap pesan menjadi struct Rust yang menurunkan Clone, PartialEq, dan Message milik prost.

// generated (sketch):
// pub mod greeter_server { pub trait Greeter { /* methods */ } }
// pub mod greeter_client { pub struct GreeterClient<T> { /* ... */ } }

Menambahkan Derive dengan type_attribute

Sering kali Anda memerlukan derive tambahan pada struct yang dibuat, seperti serde::Serialize. Gunakan type_attribute untuk menyisipkan atribut pada tipe tertentu atau pada semuanya dengan ..

Dengan demikian, pesan yang dibuat dapat digunakan dalam API JSON atau perlengkapan pengujian.

tonic_build::configure()
    .type_attribute(".", "#[derive(serde::Serialize)]")
    .compile_protos(&["proto/greeter.proto"], &["proto"])?;

Memicu Build Ulang

Cargo menjalankan ulang build.rs hanya ketika menganggap input berubah. Keluarkan baris cargo:rerun-if-changed agar penyuntingan berkas proto memaksa pembuatan ulang.

Tanpa ini, proto yang berubah mungkin tidak dibuat ulang sampai Anda menyentuh berkas 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(())
}

Persyaratan protoc

Dahulu, tonic-build menjalankan kompiler protoc sebagai proses eksternal, sehingga kompiler tersebut harus dipasang. Versi modern dapat menggunakan pengurai protox murni Rust untuk menghindari dependensi itu.

Jika Anda melihat galat protoc yang tidak ditemukan, pasang protoc atau aktifkan fitur kompiler vendored.

// In CI you may install protoc, e.g.:
// apt-get install -y protobuf-compiler

Kumpulan Deskriptor Berkas

Untuk refleksi atau alat bantu tingkat lanjut, minta tonic-build menghasilkan kumpulan deskriptor berkas dengan file_descriptor_set_path.

Byte yang dihasilkan dapat diberikan ke tonic-reflection, sehingga alat seperti grpcurl dapat menemukan layanan Anda saat runtime.

tonic_build::configure()
    .file_descriptor_set_path(
        std::env::var("OUT_DIR").unwrap() + "/greeter.bin")
    .compile_protos(&["proto/greeter.proto"], &["proto"])?;

Pemeriksaan Singkat

Ke mana kode tonic yang dibuat ditempatkan dan bagaimana kode tersebut dimuat?

Ringkasan

Anda telah menyiapkan dependensi, menulis build.rs, mengonfigurasi pembuatan klien/server dan jalur include, memuat kode melalui include_proto!, menambahkan derive, menangani pemicu build ulang, serta mempelajari protoc dan kumpulan deskriptor.

Berikutnya, Anda akan mengimplementasikan trait server yang dibuat oleh tonic.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Membuat Kode dengan tonic-build” gratis?

Ya — teks lengkap “Membuat Kode dengan tonic-build” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus Learn Rust Coding, upgrade ke CoddyKit PRO. Kursus Learn Rust Coding mencakup 4 pelajaran total.

Apa yang akan aku pelajari di “Membuat Kode dengan tonic-build”?

Kompilasi proto menjadi Rust. Kamu berlatih Learn Rust Coding dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.

Apakah aku perlu pengalaman untuk memulai Learn Rust Coding?

Tidak diperlukan pengalaman sebelumnya. Learn Rust Coding di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.

Berapa lama pelajaran “Membuat Kode dengan tonic-build” memakan waktu?

Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.

Bisakah aku menulis dan menjalankan kode dalam pelajaran Learn Rust Coding ini?

Ya. Setiap pelajaran Learn Rust Coding menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.

Semua pelajaran dalam kursus ini

  1. Definisi Protobuf dan Layanan
  2. Membuat Kode dengan tonic-build
  3. Mengimplementasikan Server gRPC
  4. Memanggil dari Klien gRPC
← Kembali ke Learn Rust Coding