प्रोटोकॉल बफ़र के नियम

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

नियम

proto_lang_toolchain

नियम का सोर्स देखें
proto_lang_toolchain(name, blacklisted_protos, command_line, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, features, licenses, mnemonic, output_files, plugin, plugin_format_flag, progress_message, proto_compiler, restricted_to, runtime, tags, target_compatible_with, testonly, visibility)

अगर Bazel का इस्तेमाल किया जा रहा है, तो कृपया नियम को https://github.com/bazelbuild/rules_proto से लोड करें.

इससे पता चलता है कि LANG_proto_library नियम (उदाहरण के लिए, java_proto_library) को प्रोटो-कंपाइलर को कॉल करना चाहिए. LANG_proto_library के कुछ नियमों की मदद से, कमांड-लाइन फ़्लैग का इस्तेमाल करके यह तय किया जा सकता है कि किस टूलचेन का इस्तेमाल करना है. इसके लिए, उनके दस्तावेज़ देखें.

आम तौर पर, आपको इस तरह के नियम तब तक नहीं लिखने चाहिए, जब तक कि आपको अपने Java कंपाइलर को बेहतर नहीं बनाना है.

कोई कंपाइलर नहीं है. प्रोटो-कंपाइलर को proto_library नियम से लिया जाता है, जिसे हम अटैच करते हैं. इसे Blaze को कमांड-लाइन फ़्लैग के तौर पर पास किया जाता है. कई सुविधाओं के लिए, proto_library नियम पर प्रोटो-कंपाइलर को लागू करना ज़रूरी है. LANG_proto_library और proto_library, दोनों एक ही कंपाइलर का इस्तेमाल करते हैं.

उदाहरण

इसका एक आसान उदाहरण यह है:

proto_lang_toolchain(
    name = "javalite_toolchain",
    command_line = "--javalite_out=shared,immutable:$(OUT)",
    plugin = ":javalite_plugin",
    runtime = ":protobuf_lite",
)

तर्क

विशेषताएं
name

नाम; यह ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

blacklisted_protos

लेबल की सूची; डिफ़ॉल्ट [] है

blacklisted_protos के srcs एट्रिब्यूट में मौजूद फ़ाइलों के लिए कोई कोड जनरेट नहीं किया जाएगा. इसका इस्तेमाल उन .proto फ़ाइलों के लिए किया जाता है जो पहले से ही प्रोटो रनटाइम से लिंक होती हैं, जैसे कि any.proto.
command_line

स्ट्रिंग; ज़रूरी है

कोड जनरेट करने के लिए, यह वैल्यू प्रोटो-कंपाइलर को भेजी जाएगी. सिर्फ़ इस कोड-जनरेटर/प्लग इन के लिए बने हिस्से शामिल करें (उदाहरण के लिए, -I पैरामीटर शामिल न करें)
  • $(OUT), LANG_proto_library के हिसाब से होता है. नियमों से यह तय होना चाहिए कि वे इस वैरिएबल का विश्लेषण कैसे करते हैं. उदाहरण के लिए, Java के लिए, $(OUT) को बनाए जाने वाले src-jar फ़ाइल नाम से बदल दिया जाएगा.
mnemonic

स्ट्रिंग; डिफ़ॉल्ट रूप से "GenProto"

यह वैल्यू, protoc ऐक्शन पर मेनिमोनिक के तौर पर सेट की जाएगी.
output_files

स्ट्रिंग; डिफ़ॉल्ट रूप से "legacy"

यह कंट्रोल करता है कि command_line में $(OUT) को कैसे फ़ॉर्मैट किया जाए. इसके लिए, एक फ़ाइल के पाथ या एक से ज़्यादा फ़ाइलों के मामले में आउटपुट डायरेक्ट्री का इस्तेमाल किया जाता है. संभावित वैल्यू: "single", "multiple".
plugin

लेबल; डिफ़ॉल्ट None है

अगर यह पैरामीटर दिया गया है, तो इसे प्रोटो-कंपाइलर को कॉल करने वाले ऐक्शन के लिए उपलब्ध कराया जाएगा. साथ ही, इसे प्रोटो-कंपाइलर को भेजा जाएगा: --plugin=protoc-gen-PLUGIN=<executable>.
plugin_format_flag

स्ट्रिंग; डिफ़ॉल्ट रूप से ""

अगर यह वैल्यू दी जाती है, तो प्लग इन का इस्तेमाल करने के लिए, यह वैल्यू प्रोटो-कंपाइलर को भेज दी जाएगी. वैल्यू में एक %s होना चाहिए, जिसे प्लग इन के लिए एक्सीक्यूटेबल फ़ाइल से बदल दिया जाता है. --plugin=protoc-gen-PLUGIN=<executable>.
progress_message

स्ट्रिंग; डिफ़ॉल्ट रूप से "Generating proto_library %{label}"

यह वैल्यू, प्रोटोकॉल ऐक्शन पर प्रोग्रेस मैसेज के तौर पर सेट की जाएगी.
proto_compiler

लेबल; डिफ़ॉल्ट None है

प्रोटो कंपाइलर एक्सीक्यूटेबल. अगर यह दिया गया है, तो कोड जनरेट करने के लिए इस टारगेट का इस्तेमाल प्रोटो-कंपाइलर के तौर पर किया जाएगा.
runtime

लेबल; डिफ़ॉल्ट None है

भाषा के हिसाब से लाइब्रेरी, जिससे जनरेट किया गया कोड कंपाइल किया जाता है. LANG_proto_library के हिसाब से, बिहेवियर अलग-अलग होता है. उदाहरण के लिए, Java को रनटाइम के हिसाब से कंपाइल करना चाहिए.

proto_library

नियम का सोर्स देखें
proto_library(name, deps, srcs, data, allow_exports, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, import_prefix, licenses, restricted_to, strip_import_prefix, tags, target_compatible_with, testonly, visibility)

समर्थन नहीं होना या रुकना. इसके बजाय, कृपया https://github.com/bazelbuild/rules_proto का इस्तेमाल करें.

प्रोटोकॉल बफ़र की लाइब्रेरी तय करने के लिए proto_library का इस्तेमाल करें. इन लाइब्रेरी का इस्तेमाल कई भाषाओं में किया जा सकता है. proto_library को, काम करने वाले नियमों के deps क्लॉज़ में शामिल किया जा सकता है, जैसे कि java_proto_library.

कमांड-लाइन पर कंपाइल करने पर, proto_library एक ऐसी फ़ाइल बनाता है जिसका नाम foo-descriptor-set.proto.bin होता है. यह फ़ाइल, मैसेज के लिए डिस्क्रिप्टर सेट होती है, जो कि नियम के सोर्स होते हैं. यह फ़ाइल, FileDescriptorSet का क्रम से लगाया गया वर्शन है. इस बारे में ज़्यादा जानकारी के लिए, https://developers.google.com/protocol-buffers/docs/techniques#self-description पर जाएं.

इसमें सिर्फ़ उन .proto फ़ाइलों की जानकारी होती है जिनके बारे में proto_library नियम में सीधे तौर पर बताया गया हो. ट्रांज़िटिव डिस्क्रिप्टर सेट का कलेक्शन, [ProtoInfo].transitive_descriptor_sets Starlark प्रोवाइडर के ज़रिए उपलब्ध होता है. ProtoInfo.java में दस्तावेज़ देखें.

कोड के लिए सुझाया गया क्रम:

  • हर .proto फ़ाइल के लिए एक proto_library नियम.
  • foo.proto नाम की फ़ाइल, foo_proto नाम के उस नियम में होगी जो एक ही पैकेज में मौजूद है.
  • foo_proto नाम वाले proto_library को रैप करने वाले [language]_proto_library को foo_[language]_proto कहा जाना चाहिए. साथ ही, यह एक ही पैकेज में होना चाहिए.

तर्क

विशेषताएं
name

नाम; यह ज़रूरी है

इस टारगेट के लिए यूनीक नाम.

deps

लेबल की सूची; डिफ़ॉल्ट [] है

टारगेट पर लागू होने वाले अन्य proto_library नियमों की सूची. proto_library सिर्फ़ दूसरे proto_library टारगेट पर निर्भर हो सकता है. ऐसा हो सकता है कि यह भाषा के हिसाब से लाइब्रेरी पर निर्भर न हो.
srcs

लेबल की सूची; डिफ़ॉल्ट [] है

टारगेट बनाने के लिए प्रोसेस की गई .proto और .protodevel फ़ाइलों की सूची. आम तौर पर, यह सूची खाली नहीं होती. अन्य नाम वाली लाइब्रेरी एक ऐसा उदाहरण है जहां srcs खाली हो सकता है. यह एक ऐसा proto_library नियम है जिसमें deps में एक या उससे ज़्यादा अन्य proto_library हैं. इस पैटर्न का इस्तेमाल, किसी सार्वजनिक एपीआई को किसी ऐसे नाम से एक्सपोर्ट करने के लिए किया जा सकता है जो हमेशा मौजूद रहता है.
allow_exports

लेबल; डिफ़ॉल्ट None है

एक वैकल्पिक अनुमति वाली सूची, जो प्रोटो लाइब्रेरी को फिर से एक्सपोर्ट करने या सूची में शामिल किसी पैकेज में, lang_proto_library का इस्तेमाल करने से रोकती है.
exports

लेबल की सूची; डिफ़ॉल्ट [] है

proto_library टारगेट की सूची, जिन्हें proto के सोर्स में "import public" के ज़रिए रेफ़र किया जा सकता है.
import_prefix

स्ट्रिंग; डिफ़ॉल्ट रूप से ""

इस नियम में .proto फ़ाइलों के पाथ में जोड़ने के लिए प्रीफ़िक्स.

सेट होने पर, इस नियम के srcs एट्रिब्यूट में मौजूद .proto सोर्स फ़ाइलों को इस एट्रिब्यूट की वैल्यू पर ऐक्सेस किया जा सकता है. यह वैल्यू, उनकी रिपॉज़िटरी के हिसाब से तय किए गए पाथ के आगे जोड़ी जाती है.

इस प्रीफ़िक्स को जोड़ने से पहले, strip_import_prefix एट्रिब्यूट में मौजूद प्रीफ़िक्स को हटा दिया जाता है.

strip_import_prefix

स्ट्रिंग; डिफ़ॉल्ट रूप से ""

इस नियम में, .proto फ़ाइलों के पाथ से हटाने के लिए प्रीफ़िक्स.

सेट होने पर, इस नियम के srcs एट्रिब्यूट में मौजूद .proto सोर्स फ़ाइलों को उनके पाथ पर ऐक्सेस किया जा सकता है. हालांकि, इसके लिए प्रीफ़िक्स को काटना होगा.

अगर यह रिलेटिव पाथ है (स्लैश से शुरू नहीं होता), तो इसे पैकेज के हिसाब से रिलेटिव पाथ माना जाता है. अगर यह ऐब्सलूट पाथ है, तो इसे रिपॉज़िटरी से रिलेटिव पाथ माना जाता है.

import_prefix एट्रिब्यूट में प्रीफ़िक्स, इस प्रीफ़िक्स को हटाने के बाद जोड़ा जाता है.