מודולים של Protobuf

מערכת ה-build תומכת ביצירת ממשקי protobuf באמצעות סוג המודול rust_protobuf.

יצירת קוד protobuf בסיסי מתבצעת באמצעות ה-crate‏ rust-protobuf. למסמכי עזרה בנושא השימוש הזה, אפשר לעיין בדף הפרויקט ב-GitHub עם דוגמאות מתאימות ל-protobuf.

יש גם תמיכה ב-protobufs של gRPC, והיצירה שלהם מתבצעת על ידי ה-crate‏ grpc-rs. למסמכי עזרה בנושא השימוש הזה, אפשר לעיין במסמכים בדף הפרויקט ב-GitHub של gRPC המתאים.

שימוש בסיסי ב-rust_protobuf build

בדוגמה הבאה מוסבר איך מגדירים מודול 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 הזה, מפנים אליו כאילו הוא תלות בספרייה אחרת:

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",
}

הגישה לפרוטוקולים השונים בתוך ה-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

המאפיינים שמפורטים בהמשך הם בנוסף למאפיינים משותפים חשובים שחלים על כל המודולים. הם חשובים במיוחד למודולים של protobuf ב-Rust, או שהם מציגים התנהגות ייחודית ספציפית לסוג המודול rust_protobuf.

stem, ‏ name, ‏ crate_name

rust_protobuf יוצר וריאנטים של ספריות, ולכן הדרישות שחלות על שלושת המאפיינים האלה זהות לאלה שחלות על המודולים של 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, גם הקבוצה המלאה של מאפייני הספרייה זמינה כדי לשלוט בתהליך ה-compilation של הספרייה, אבל בדרך כלל אין צורך להגדיר או לשנות אותם.