Protobuf and gRPC rules for Bazel#

Bazel rules for building Protobuf and gRPC code and libraries from proto_library targets.

If you or your company find these rules useful, please consider supporting the time spent building and maintaining these rules

Latest Release Buildkite Status Slack Channel

Overview#

These rules provide a consistent set of Protocol Buffers (Protobuf) and gRPC Bazel rules for a wide range of supported languages, services and tools. This aims to encompass all aspects of working with .proto files, such as:

  • Generation of language specific source files with protoc

  • Creation of libraries from protoc source file outputs

  • Linting and checking for breaking changes with Buf

  • Producing documentation from your Protobuf definitions with protoc-gen-doc

Each supported language (shown as {lang} below) is generally split into four rule types:

  • {lang}_proto_compile: Provides generated files from the Protobuf protoc plugin for the language. For example, for C++ this provides the generated *.pb.cc and *.pb.h files.

  • {lang}_proto_library: Provides a language-specific library from the generated Protobuf protoc plugin outputs, along with necessary dependencies. For example, for C++ this provides a Bazel native cpp_library created from the generated *.pb.cc and *.pb.h files, with the Protobuf library linked.

  • {lang}_grpc_compile: Provides generated files from both the Protobuf and gRPC protoc plugins for the language. For example, for C++ this provides the generated *.pb.cc, *.grpc.pb.cc, *.pb.h and *.grpc.pb.h files.

  • {lang}_grpc_library: Provides a language-specific library from the generated Protobuf and gRPC protoc plugins outputs, along with necessary dependencies. For example, for C++ this provides a Bazel native cpp_library created from the generated *.pb.cc, *.grpc.pb.cc, *.pb.h and *.grpc.pb.h files, with the Protobuf and gRPC libraries linked.

Some languages may have variations on these rules, such as when there are multiple gRPC or Protobuf implementations. However, generally you’ll want to use the {lang}_{proto|grpc}_library rules, since these bundle up all the outputs into a library that can easily be used elsewhere in your Bazel workspace. Alternatively, if you just want the generated source code files, you can use the {lang}_{proto|grpc}_compile rules instead.

If you just need compilation of .proto files for a single language, you may find your language specific Bazel rules have their own Protobuf or gRPC rules, which may be preferrable in a single-language repo.

Installation#

Support for each language is provided by a separate module, which should be added to your MODULE.bazel file. Details for each language’s module installation and usage are provided in the language specific documentation pages. For example, for Go support, you would add the following line:

bazel_dep(name = "rules_proto_grpc_go", version = "<version number here>")

Supported Languages and Tools#

Supported Languages#

Language

Protobuf

gRPC

C

C++

Go

Java

Objective-C

Python

Supported Tools#

Buf Linting

Checks .proto files for common errors and adherance to style guidelines

Buf Breaking Change Detection

Checks .proto files for changes to messages that would break existing clients

grpc-gateway

Produces source files for creating gRPC to JSON proxies

protoc-gen-doc

Creates Markdown, JSON, HTML or DocBook documentation files from your .proto files