बिल्ड सिस्टम, rust_protobuf
मॉड्यूल टाइप की मदद से, प्रोटोबुक इंटरफ़ेस जनरेट करता है.
बुनियादी प्रोटोबफ़ कोड जनरेट करने के लिए, rust-protobuf
क्रेट का इस्तेमाल किया जाता है.
इस इस्तेमाल के बारे में दस्तावेज़ देखने के लिए, GitHub प्रोजेक्ट पेज पर जाएं. यहां आपको protobuf के उदाहरण मिलेंगे.
gRPC प्रोटोबस भी काम करते हैं. इन्हें जनरेट करने की सुविधा, grpc-rs
क्रेट से मिलती है.
इस इस्तेमाल के बारे में दस्तावेज़ देखने के लिए, उससे जुड़े gRPC GitHub प्रोजेक्ट पेज पर मौजूद दस्तावेज़ देखें.
रस्ट_प्रोटोबफ़ के बिल्ड के इस्तेमाल से जुड़ी बुनियादी जानकारी
यहां protobuf मॉड्यूल तय करने और उस मॉड्यूल को क्रेट के तौर पर इस्तेमाल करने का उदाहरण दिया गया है. rust_protobuf
तय करना सेक्शन में, अहम प्रॉपर्टी और उनके इस्तेमाल के तरीके के बारे में ज़्यादा जानकारी दी गई है.
अगर आपको include!()
मैक्रो के ज़रिए, तीसरे पक्ष के कोड जैसे protobuf जनरेट किए गए कोड का इस्तेमाल करना है, तो उदाहरण के लिए सोर्स जनरेटर पेज देखें. (उदाहरण में 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
मॉड्यूल टाइप के लिए अलग तरह के काम करते हैं.
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
, जनरेट की गई सोर्स फ़ाइल का फ़ाइल नाम है. इसे शामिल किया जा सकता है.
यह ज़रूरी फ़ील्ड है, भले ही आपने बाइंडिंग का इस्तेमाल, क्रेट के तौर पर किया हो. इसकी वजह यह है कि stem
प्रॉपर्टी, जनरेट की गई लाइब्रेरी के वैरिएंट के लिए सिर्फ़ आउटपुट फ़ाइल का नाम कंट्रोल करती है. अन्य सोर्स जनरेटर के उलट, फ़ाइल के नाम के आगे mod_ जोड़ दिया जाता है. इससे फ़ाइनल फ़ाइल का नाम mod_<stem> हो जाता है. इससे, हर प्रोटो से जनरेट किए गए सोर्स के नाम में कोई गड़बड़ी नहीं होती.
इसके अलावा, बाइंडजन बाइंडिंग मॉड्यूल की तरह, लाइब्रेरी कंपाइलेशन को कंट्रोल करने के लिए लाइब्रेरी प्रॉपर्टी का पूरा सेट भी उपलब्ध है. हालांकि, इन्हें तय करने या बदलने की ज़रूरत बहुत ही कम होती है.