बिल्ड सिस्टम, rust_protobuf मॉड्यूल टाइप की मदद से, प्रोटोबफ़ इंटरफ़ेस जनरेट करने की सुविधा देता है.
बुनियादी प्रोटॉबफ़ कोड जनरेट करने के लिए, rust-protobuf क्रेट का इस्तेमाल किया जाता है.
इसके इस्तेमाल से जुड़े दस्तावेज़ देखने के लिए, GitHub प्रोजेक्ट पेज पर जाएं. यहां आपको इससे जुड़े protobuf उदाहरण भी मिलेंगे.
gRPC protobufs भी काम करते हैं. इन्हें grpc-rs crate जनरेट करता है.
इसके इस्तेमाल से जुड़े दस्तावेज़ देखने के लिए, gRPC के GitHub प्रोजेक्ट पेज पर मौजूद दस्तावेज़ देखें.
rust_protobuf को बनाने के लिए इस्तेमाल करने का बुनियादी तरीका
यहां एक प्रोटोटाइप मॉड्यूल को तय करने और उस मॉड्यूल को क्रेट के तौर पर इस्तेमाल करने का उदाहरण दिया गया है. अहम प्रॉपर्टी और उनके इस्तेमाल के तरीके के बारे में ज़्यादा जानकारी, rust_protobuf तय करना सेक्शन में दी गई है.
अगर आपको include!() मैक्रो के ज़रिए, जनरेट किए गए प्रोटॉबफ़ कोड का इस्तेमाल करना है, जैसे कि तीसरे पक्ष के कोड के लिए, तो उदाहरण के लिए सोर्स जनरेटर पेज देखें. (इस उदाहरण में rust_bindgen मॉड्यूल का इस्तेमाल किया गया है. हालांकि, सोर्स शामिल करने का तरीका सभी सोर्स जनरेटर के लिए एक जैसा होता है.)
rust_protobuf Android.bp मॉड्यूल तय करना
मान लें कि आपके Android.bp के हिसाब से, कुछ प्रोटो src/protos/my.proto पर हैं. इसके बाद, मॉड्यूल को इस तरह से तय किया जाता है:
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",
}
इस क्रेट का इस्तेमाल करने वाली लाइब्रेरी को, किसी अन्य लाइब्रेरी डिपेंडेंसी की तरह ही रेफ़रंस करके तय किया जाता है:
rust_binary {
name: "hello_rust_proto",
srcs: ["src/main.rs"],
rustlibs: ["libmy_proto"],
}
rust_protobuf मॉड्यूल का क्रेट स्ट्रक्चर
हर Protobuf फ़ाइल को क्रेट में उसके खुद के मॉड्यूल के तौर पर व्यवस्थित किया जाता है. इसका नाम Protobuf फ़ाइल के नाम पर रखा जाता है. इसका मतलब है कि सभी प्रोटो बेस फ़ाइल के नाम यूनीक होने चाहिए. उदाहरण के लिए, rust_protobuf को इस तरह से परिभाषित किया गया है:
rust_protobuf {
name: "libfoo",
crate_name: "foo",
protos: ["a.proto", "b.proto"],
grpc_protos: ["c.proto"],
source_stem: "my_proto_source",
}
इस क्रेट में मौजूद अलग-अलग प्रोटो को इस तरह से ऐक्सेस किया जाएगा:
// 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 लाइब्रेरी के वैरिएंट बनाता है. इसलिए, इन तीन प्रॉपर्टी के लिए वही ज़रूरी शर्तें लागू होती हैं जो rust_library मॉड्यूल के लिए लागू होती हैं. ज़्यादा जानकारी के लिए, rust_library प्रॉपर्टी देखें.
protos
यह प्रोटॉबफ़ फ़ाइलों के रिलेटिव पाथ की सूची है. इसका इस्तेमाल प्रोटॉबफ़ इंटरफ़ेस जनरेट करने के लिए किया जाता है. protos और grpc_protos में, बेस फ़ाइल के नाम अलग-अलग होने चाहिए.
grpc_protos
grpc_protos में, उन protobuf फ़ाइलों के रिलेटिव पाथ की सूची होती है जो protobuf इंटरफ़ेस जनरेट करने के लिए grpcs को तय करती हैं. protos और grpc_protos में, बेस फ़ाइल के नाम अलग-अलग होने चाहिए.
source_stem
source_stem, जनरेट की गई सोर्स फ़ाइल का फ़ाइल नाम है, जिसे शामिल किया जा सकता है.
यह फ़ील्ड की ज़रूरी परिभाषा है. भले ही, बाइंडिंग का इस्तेमाल क्रेट के तौर पर किया जा रहा हो. ऐसा इसलिए, क्योंकि stem प्रॉपर्टी सिर्फ़ जनरेट की गई लाइब्रेरी के वैरिएंट के आउटपुट फ़ाइल नाम को कंट्रोल करती है. अन्य सोर्स जनरेटर के उलट, फ़ाइल के नाम के आगे mod_ प्रीफ़िक्स जुड़ जाता है. इससे फ़ाइल का नाम mod_<stem> हो जाता है. इससे हर प्रोटो से जनरेट किए गए सोर्स के नाम एक जैसे नहीं होते.
इसके अलावा, bindgen बाइंडिंग मॉड्यूल की तरह, लाइब्रेरी की सभी प्रॉपर्टी भी लाइब्रेरी के कंपाइलेशन को कंट्रोल करने के लिए उपलब्ध होती हैं. हालांकि, इन्हें कभी-कभार ही तय करने या बदलने की ज़रूरत होती है.