โมดูล Protobuf

ระบบบิลด์รองรับการสร้างอินเทอร์เฟซ Protobuf ผ่านrust_protobufประเภทโมดูล

การสร้างโค้ด Protobuf ขั้นพื้นฐานจะดำเนินการด้วย Crate rust-protobuf หากต้องการดูเอกสารเกี่ยวกับการใช้งานนี้ โปรดดูหน้าโปรเจ็กต์ GitHub พร้อมตัวอย่าง protobuf ที่เกี่ยวข้อง

นอกจากนี้ยังรองรับ gRPC protobufs ด้วย โดยมี grpc-rs crate เป็นตัวสร้าง หากต้องการดูเอกสารเกี่ยวกับการใช้งานนี้ โปรดดูเอกสารในหน้าโปรเจ็กต์ gRPC บน GitHub ที่เกี่ยวข้อง

การใช้งานการสร้าง rust_protobuf ขั้นพื้นฐาน

ต่อไปนี้เป็นตัวอย่างการกำหนดโมดูล Protobuf และการใช้โมดูลดังกล่าวเป็น Crate ดูรายละเอียดเพิ่มเติมเกี่ยวกับพร็อพเพอร์ตี้ที่สำคัญและวิธีใช้ได้ที่ส่วนการกำหนด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",
}

ไลบรารีที่ใช้ Crate นี้จะกำหนดโดยการอ้างอิงเหมือนกับเป็นทรัพยากร Dependency ของไลบรารีอื่นๆ

rust_binary {
    name: "hello_rust_proto",
    srcs: ["src/main.rs"],
    rustlibs: ["libmy_proto"],
}

โครงสร้าง Crate ของโมดูล rust_protobuf

ไฟล์ Protobuf แต่ละไฟล์จะจัดระเบียบเป็นโมดูลของตัวเองภายใน Crate โดยใช้ชื่อของไฟล์ 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 ต่างๆ ภายใน Crate นี้ได้ดังนี้

// 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 คือชื่อไฟล์สำหรับไฟล์ต้นฉบับที่สร้างขึ้นซึ่งรวมได้ นี่คือคำจำกัดความของฟิลด์ที่จำเป็น แม้ว่าคุณจะใช้การเชื่อมโยงเป็น Crate เนื่องจากพร็อพเพอร์ตี้ stem จะควบคุมชื่อไฟล์เอาต์พุตสำหรับ ตัวแปรของไลบรารีที่สร้างขึ้นเท่านั้น ชื่อไฟล์จะขึ้นต้นด้วย mod_ ซึ่งแตกต่างจากเครื่องมือสร้างแหล่งข้อมูลอื่นๆ ทำให้ชื่อไฟล์สุดท้ายเป็น mod_<stem> ซึ่งจะป้องกัน การตั้งชื่อซ้ำกับแหล่งข้อมูลที่สร้างจากแต่ละ Proto

นอกจากนี้ คุณยังใช้ชุดพร็อพเพอร์ตี้ไลบรารีทั้งหมดเพื่อควบคุมการคอมไพล์ไลบรารีได้เช่นเดียวกับโมดูลการเชื่อมโยง bindgen แม้ว่าแทบจะไม่จำเป็นต้องกำหนดหรือเปลี่ยนแปลงพร็อพเพอร์ตี้เหล่านี้ก็ตาม