ระบบบิลด์รองรับการสร้างอินเทอร์เฟซ protobuf ผ่านประเภทโมดูล rust_protobuf
การสร้างโค้ด protobuf ขั้นพื้นฐานทำได้ด้วยลัง rust-protobuf
หากต้องการดูเอกสารประกอบเกี่ยวกับการใช้งานนี้ โปรดดูหน้าโปรเจ็กต์ GitHub
พร้อมตัวอย่าง protobuf ที่เกี่ยวข้องexamples
นอกจากนี้ยังรองรับ gRPC protobuf ด้วย โดยการสร้างจะทำโดยลัง grpc-rs
หากต้องการดูเอกสารประกอบเกี่ยวกับการใช้งานนี้ โปรดดูเอกสารประกอบในหน้าโปรเจ็กต์ gRPC GitHub ที่เกี่ยวข้อง
การใช้งานบิลด์ rust_protobuf ขั้นพื้นฐาน
ต่อไปนี้เป็นตัวอย่างการกำหนดโมดูล protobuf และการใช้โมดูลนั้นเป็นลัง ดูรายละเอียดเพิ่มเติมเกี่ยวกับพร็อพเพอร์ตี้ที่สำคัญและวิธีใช้ได้ในส่วนการกำหนดrust_protobuf
หากต้องการใช้โค้ดที่สร้างขึ้นโดย protobuf ผ่านมาโคร include!() เช่น
สำหรับโค้ดของบุคคลที่สาม โปรดดูตัวอย่างในหน้าเครื่องมือสร้างแหล่งที่มา
(ตัวอย่างใช้โมดูล rust_bindgen แต่วิธีการรวมแหล่งที่มาจะเหมือนกันทั้งหมดสำหรับเครื่องมือสร้างแหล่งที่มาทั้งหมด)
กำหนดโมดูล rust_protobuf Android.bp
สมมติว่ามี proto อยู่ที่ src/protos/my.proto ซึ่งสัมพันธ์กับ Android.bp โมดูลจะกำหนดไว้ดังนี้
rust_protobuf {
name: "libmy_proto",
// Crate name that's used to generate the rust_library variants.
crate_name: "my_proto",
// Relative paths to the protobuf source files
protos: ["src/protos/my.proto"],
// If protobufs define gRPCs, then they should go in grpc_protos
// instead.
// grpc_protos: ["src/protos/my.proto"],
// 'source_stem' controls the output filename.
// This is the filename that's used in an include! macro.
source_stem: "my_proto_source",
}
ระบบจะกำหนดไลบรารีที่ใช้ลังนี้โดยการอ้างอิงลังดังกล่าวราวกับเป็นทรัพยากร Dependency ของไลบรารีอื่นๆ
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
โครงสร้างลังของโมดูล rust_protobuf
ระบบจะจัดระเบียบไฟล์ protobuf แต่ละไฟล์เป็นโมดูลของตัวเองภายในลัง โดยใช้ชื่อไฟล์ protobuf ซึ่งหมายความว่าชื่อไฟล์ฐานของ proto ทั้งหมดต้องไม่ซ้ำกัน ตัวอย่างเช่น ลองดู rust_protobuf ที่กำหนดไว้ดังนี้
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
คุณจะเข้าถึง proto ต่างๆ ภายในลังนี้ได้ดังนี้
// use <crate_name>::<proto_filename>
use foo::a; // protobuf interface defined in a.proto
use foo::b; // protobuf interface defined in b.proto
use foo::c; // protobuf interface defined in c.proto
use foo::c_grpc; // grpc interface defined in c.proto
พร็อพเพอร์ตี้ rust_protobuf ที่สำคัญ
พร็อพเพอร์ตี้ที่กำหนดไว้ด้านล่างนี้เป็นพร็อพเพอร์ตี้เพิ่มเติมจากพร็อพเพอร์ตี้ทั่วไปที่สำคัญ
ซึ่งใช้ได้กับโมดูลทั้งหมด พร็อพเพอร์ตี้เหล่านี้มีความสำคัญเป็นพิเศษสำหรับโมดูล Rust protobuf หรือแสดงลักษณะการทำงานที่ไม่เหมือนใครซึ่งเฉพาะเจาะจงกับประเภทโมดูล rust_protobuf
stem, name, crate_name
rust_protobuf สร้างตัวแปรไลบรารี ดังนั้นข้อกำหนดเดียวกันจึงมีไว้สำหรับพร็อพเพอร์ตี้ทั้ง 3 รายการนี้เช่นเดียวกับโมดูล rust_library ดูรายละเอียดได้ที่
พร็อพเพอร์ตี้ rust_library
protos
นี่คือรายการเส้นทางที่สัมพันธ์กับไฟล์ protobuf เพื่อสร้างอินเทอร์เฟซ protobuf ชื่อไฟล์ฐานต้องไม่ซ้ำกันใน protos และ grpc_protos
grpc_protos
grpc_protos ประกอบด้วยรายการเส้นทางที่สัมพันธ์กับไฟล์ protobuf ที่กำหนด grpcs เพื่อสร้างอินเทอร์เฟซ protobuf ชื่อไฟล์ฐานต้องไม่ซ้ำกัน
ใน protos และ grpc_protos
source_stem
source_stem คือชื่อไฟล์สำหรับ ไฟล์แหล่งที่มาที่สร้างขึ้นซึ่งรวมได้
นี่คือคำจำกัดความของช่องที่ต้องระบุ แม้ว่าคุณจะใช้ Binding เป็นลังก็ตาม เนื่องจากพร็อพเพอร์ตี้ stem จะควบคุมชื่อไฟล์เอาต์พุตสำหรับตัวแปรไลบรารีที่สร้างขึ้นเท่านั้น เครื่องมือสร้างแหล่งที่มาอื่นๆ จะเพิ่มคำนำหน้า mod_ ให้กับชื่อไฟล์
ซึ่งทำให้ชื่อไฟล์สุดท้ายเป็น mod_<stem> ซึ่งจะป้องกันไม่ให้ชื่อซ้ำกับแหล่งที่มาที่สร้างขึ้นจาก proto แต่ละรายการ
นอกจากนี้ ชุดพร็อพเพอร์ตี้ไลบรารีทั้งหมดจะพร้อมใช้งานเพื่อควบคุมการคอมไพล์ไลบรารีเช่นเดียวกับโมดูล Binding ของ bindgen แม้ว่าคุณจะไม่ค่อยจำเป็นต้องกำหนดหรือเปลี่ยนแปลงพร็อพเพอร์ตี้เหล่านี้ก็ตาม