| --- |
| title: 'Protocol Buffer Rules' |
| --- |
| |
| ## Rules |
| |
| * [proto\_lang\_toolchain](#proto_lang_toolchain) |
| * [proto\_library](#proto_library) |
| |
| ## proto\_lang\_toolchain |
| |
| [View rule sourceopen\_in\_new](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchainRule.java) |
| |
| ``` |
| 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) |
| ``` |
| |
| If using Bazel, please load the rule from <https://github.com/bazelbuild/rules_proto>. |
| |
| Specifies how a LANG\_proto\_library rule (e.g., `java_proto_library`) should invoke the |
| proto-compiler. |
| Some LANG\_proto\_library rules allow specifying which toolchain to use using command-line flags; |
| consult their documentation. |
| |
| Normally you should not write those kind of rules unless you want to |
| tune your Java compiler. |
| |
| There's no compiler. The proto-compiler is taken from the proto\_library rule we attach to. It is |
| passed as a command-line flag to Blaze. |
| Several features require a proto-compiler to be invoked on the proto\_library rule itself. |
| It's beneficial to enforce the compiler that LANG\_proto\_library uses is the same as the one |
| `proto_library` does. |
| |
| #### Examples |
| |
| A simple example would be: |
| |
| ``` |
| proto_lang_toolchain( |
| name = "javalite_toolchain", |
| command_line = "--javalite_out=shared,immutable:$(OUT)", |
| plugin = ":javalite_plugin", |
| runtime = ":protobuf_lite", |
| ) |
| ``` |
| |
| ### Arguments |
| |
| | Attributes | | |
| | --- | --- | |
| | `name` | [Name](/versions/7.6.1/concepts/labels#target-names); required A unique name for this target. | |
| | `blacklisted_protos` | List of [labels](/versions/7.6.1/concepts/labels); default is `[]` No code will be generated for files in the `srcs` attribute of `blacklisted_protos`. This is used for .proto files that are already linked into proto runtimes, such as `any.proto`. | |
| | `command_line` | String; required This value will be passed to proto-compiler to generate the code. Only include the parts specific to this code-generator/plugin (e.g., do not include -I parameters) * `$(OUT)` is LANG\_proto\_library-specific. The rules are expected to define how they interpret this variable. For Java, for example, $(OUT) will be replaced with the src-jar filename to create. | |
| | `mnemonic` | String; default is `"GenProto"` This value will be set as the mnemonic on protoc action. | |
| | `output_files` | String; default is `"legacy"` Controls how `$(OUT)` in `command_line` is formatted, either by a path to a single file or output directory in case of multiple files. Possible values are: "single", "multiple". | |
| | `plugin` | [Label](/versions/7.6.1/concepts/labels); default is `None` If provided, will be made available to the action that calls the proto-compiler, and will be passed to the proto-compiler: `--plugin=protoc-gen-PLUGIN=<executable>.` | |
| | `plugin_format_flag` | String; default is `""` If provided, this value will be passed to proto-compiler to use the plugin. The value must contain a single %s which is replaced with plugin executable. `--plugin=protoc-gen-PLUGIN=<executable>.` | |
| | `progress_message` | String; default is `"Generating proto_library %{label}"` This value will be set as the progress message on protoc action. | |
| | `proto_compiler` | [Label](/versions/7.6.1/concepts/labels); default is `None` The proto compiler executable. If provided, this target will be used as a proto-compiler to generate the code. | |
| | `runtime` | [Label](/versions/7.6.1/concepts/labels); default is `None` A language-specific library that the generated code is compiled against. The exact behavior is LANG\_proto\_library-specific. Java, for example, should compile against the runtime. | |
| |
| ## proto\_library |
| |
| [View rule sourceopen\_in\_new](https://github.com/bazelbuild/bazel/blob/master/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibraryRule.java) |
| |
| ``` |
| 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) |
| ``` |
| |
| Deprecated. Please use <https://github.com/bazelbuild/rules_proto> instead. |
| |
| Use `proto_library` to define libraries of protocol buffers |
| which may be used from multiple languages. A `proto_library` may be listed |
| in the `deps` clause of supported rules, such as `java_proto_library`. |
| |
| When compiled on the command-line, a `proto_library` creates a file named |
| `foo-descriptor-set.proto.bin`, which is the descriptor set for the |
| messages the rule srcs. The file is a serialized `FileDescriptorSet`, which is |
| described in |
| <https://developers.google.com/protocol-buffers/docs/techniques#self-description>. |
| |
| It only contains information about the `.proto` files directly mentioned by a |
| `proto_library` rule; the collection of transitive descriptor sets is available through |
| the `[ProtoInfo].transitive_descriptor_sets` Starlark provider. |
| See documentation in `ProtoInfo.java`. |
| |
| Recommended code organization: |
| |
| * One `proto_library` rule per `.proto` file.* A file named `foo.proto` will be in a rule named `foo_proto`, which |
| is located in the same package.* A `[language]_proto_library` that wraps a `proto_library` named |
| `foo_proto` should be called |
| `foo_[language]_proto`, and be located in the same package. |
| |
| ### Arguments |
| |
| | Attributes | | |
| | --- | --- | |
| | `name` | [Name](/versions/7.6.1/concepts/labels#target-names); required A unique name for this target. | |
| | `deps` | List of [labels](/versions/7.6.1/concepts/labels); default is `[]` The list of other `proto_library` rules that the target depends upon. A `proto_library` may only depend on other `proto_library` targets. It may not depend on language-specific libraries. | |
| | `srcs` | List of [labels](/versions/7.6.1/concepts/labels); default is `[]` The list of `.proto` and `.protodevel` files that are processed to create the target. This is usually a non empty list. One usecase where `srcs` can be empty is an *alias-library*. This is a proto\_library rule having one or more other proto\_library in `deps`. This pattern can be used to e.g. export a public api under a persistent name. | |
| | `allow_exports` | [Label](/versions/7.6.1/concepts/labels); default is `None` An optional allowlist that prevents proto library to be reexported or used in lang\_proto\_library that is not in one of the listed packages. | |
| | `exports` | List of [labels](/versions/7.6.1/concepts/labels); default is `[]` List of proto\_library targets that can be referenced via "import public" in the proto source. | |
| | `import_prefix` | String; default is `""` The prefix to add to the paths of the .proto files in this rule. When set, the .proto source files in the `srcs` attribute of this rule are accessible at is the value of this attribute prepended to their repository-relative path. The prefix in the `strip_import_prefix` attribute is removed before this prefix is added. | |
| | `strip_import_prefix` | String; default is `""` The prefix to strip from the paths of the .proto files in this rule. When set, .proto source files in the `srcs` attribute of this rule are accessible at their path with this prefix cut off. If it's a relative path (not starting with a slash), it's taken as a package-relative one. If it's an absolute one, it's understood as a repository-relative path. The prefix in the `import_prefix` attribute is added after this prefix is stripped. | |