बिल्ड सिस्टम, rust_protobuf
मॉड्यूल टाइप की मदद से, प्रोटोबफ़ इंटरफ़ेस जनरेट करने की सुविधा देता है.
बुनियादी Protobuf कोड जनरेट करने के लिए, rust-protobuf
क्रेट का इस्तेमाल किया जाता है.
इसके इस्तेमाल से जुड़े दस्तावेज़ देखने के लिए, GitHub प्रोजेक्ट पेज पर जाएं. यहां आपको इससे जुड़े protobuf उदाहरण भी मिलेंगे.
gRPC protobufs भी काम करते हैं. इन्हें grpc-rs
crate जनरेट करता है.
इसके इस्तेमाल से जुड़े दस्तावेज़ देखने के लिए, इससे जुड़े gRPC GitHub प्रोजेक्ट पेज पर मौजूद दस्तावेज़ देखें.
rust_protobuf को बनाने के लिए इस्तेमाल करने का बुनियादी तरीका
यहां 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 मॉड्यूल का क्रेट स्ट्रक्चर
हर प्रोटोबफ़ फ़ाइल को क्रेट में उसके खुद के मॉड्यूल के तौर पर व्यवस्थित किया जाता है. इसका नाम प्रोटोबफ़ फ़ाइल के नाम पर रखा जाता है. इसका मतलब है कि सभी प्रोटो बेस फ़ाइलों के नाम अलग-अलग होने चाहिए. उदाहरण के लिए, 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
मॉड्यूल टाइप के लिए खास तौर पर अलग व्यवहार दिखाते हैं.
स्टेम, नाम, crate_name
rust_protobuf
लाइब्रेरी के वैरिएंट बनाता है. इसलिए, इन तीन प्रॉपर्टी के लिए वही ज़रूरी शर्तें लागू होती हैं जो rust_library
मॉड्यूल के लिए लागू होती हैं. ज़्यादा जानकारी के लिए, rust_library
प्रॉपर्टी देखें.
प्रोटो
यह प्रोटॉबफ़ इंटरफ़ेस जनरेट करने के लिए, प्रोटॉबफ़ फ़ाइलों के रिलेटिव पाथ की सूची है. protos
और grpc_protos
में बेस फ़ाइल के नाम अलग-अलग होने चाहिए.
grpc_protos
grpc_protos
में, उन protobuf फ़ाइलों के रिलेटिव पाथ की सूची होती है जो protobuf इंटरफ़ेस जनरेट करने के लिए grpcs
को तय करती हैं. protos
और grpc_protos
में, बेस फ़ाइल के नाम अलग-अलग होने चाहिए.
source_stem
source_stem
, जनरेट की गई सोर्स फ़ाइल का फ़ाइल नाम है, जिसे शामिल किया जा सकता है.
यह फ़ील्ड की ज़रूरी परिभाषा है. भले ही, बाइंडिंग का इस्तेमाल क्रेट के तौर पर किया जा रहा हो. ऐसा इसलिए, क्योंकि stem
प्रॉपर्टी सिर्फ़ जनरेट किए गए लाइब्रेरी वैरिएंट के आउटपुट फ़ाइल नाम को कंट्रोल करती है. सोर्स जनरेट करने वाले अन्य टूल के उलट, फ़ाइल के नाम के आगे mod_ प्रीफ़िक्स जुड़ जाता है. इससे फ़ाइल का नाम mod_<stem> हो जाता है. इससे हर प्रोटो से जनरेट किए गए सोर्स के नाम एक जैसे नहीं होते.
इसके अलावा, bindgen bindings मॉड्यूल की तरह, लाइब्रेरी की सभी प्रॉपर्टी भी लाइब्रेरी के कंपाइलेशन को कंट्रोल करने के लिए उपलब्ध होती हैं. हालांकि, इन्हें कभी-कभार ही तय करने या बदलने की ज़रूरत होती है.