โมดูล Protobuf

ระบบบิลด์รองรับการสร้างอินเทอร์เฟซ 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 แม้ว่าคุณจะไม่ค่อยจำเป็นต้องกำหนดหรือเปลี่ยนแปลงพร็อพเพอร์ตี้เหล่านี้ก็ตาม