प्रोटोबफ़ मॉड्यूल

बिल्ड सिस्टम, 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> हो जाता है. इससे, हर प्रोटो से जनरेट किए गए सोर्स के नाम में कोई गड़बड़ी नहीं होती.

इसके अलावा, बाइंडजन बाइंडिंग मॉड्यूल की तरह, लाइब्रेरी कंपाइलेशन को कंट्रोल करने के लिए लाइब्रेरी प्रॉपर्टी का पूरा सेट भी उपलब्ध है. हालांकि, इन्हें तय करने या बदलने की ज़रूरत बहुत ही कम होती है.