Protocol Buffer and gRPC Reflection
This repo provides reflection APIs for protocol buffers (also known as "protobufs" for short)
and gRPC. The core of reflection in protobufs is the
A descriptor is itself a protobuf message that describes a
.proto source file or any element
therein. So a collection of descriptors can describe an entire schema of protobuf types, including
This repo was originally built to work with the "V1" API of the Protobuf runtime for Go:
Since the creation of this repo, a new runtime for Go has been release, a "V2" of the API in
google.golang.org/protobuf. This new API now includes support for functionality that this repo implements:
- Descriptors: This repo provides
github.com/jhump/protoreflect/desc. The new API now provides alternative types in
google.golang.org/protobuf/reflect/protoreflect. It also provides ways to access descriptors for statically linked types in
google.golang.org/protobuf/reflect/protoregistryand the ability to convert between these descriptor types and their "poorer cousins", descriptor protos, in
- Dynamic Messages: This repo provides
github.com/jhump/protoreflect/dynamic. The new API now provides an alternative in
- Binary Wire Format: This repo provides
github.com/jhump/protoreflect/codec. The new API now provides an alternative in
Most protobuf users have likely upgraded to that newer runtime and thus encounter some friction using this repo. It is now recommended to use the above packages in the V2 Protobuf API instead of using the corresponding packages in this repo. But that still leaves a lot of functionality in this repo, such as the
grpcreflect packages herein. And all of these packages build on the core
desc.Descriptor types in this repo. As of v1.15.0, you can convert between this repo's
desc.Descriptor types and the V2 API's
protoreflect.Descriptor types using
Wrap functions in the
desc package and
Unwrap methods on the
desc.Descriptor types. That allows easier interop between these remaining useful packages and new V2 API descriptor implementations.
If you have code that uses the
dynamic package in this repo and are trying to interop with V2 APIs, in some cases you can use the
proto.MessageV2 converter function (defined in the V1
proto package in
github.com/golang/protobuf/proto). This wrapper does not provide 100% complete interop, so in some cases you may have to port your code over to the V2 API's
dynamicpb package. (Sorry!)
Later this year (2023), we expect to cut a v2 of this whole repo. A lot of what's in this repo is no longer necessary, but some features still are. The v2 will drop functionality now provided by the V2 Protobuf API. The remaining packages will be updated to make direct use of the V2 Protobuf API and have no more references to the old V1 API. One exception is that a v2 of this repo will not include a new version of the
desc/protoparse package in this repo -- that is already available in a brand new module named
Descriptors: The Language Model of Protocol Buffers
desc package herein introduces a
Descriptor interface and implementations of it that
correspond to each of the descriptor types. These new types are effectively smart wrappers around
the generated protobuf types
that make them much more useful and easier to use.
You can construct descriptors from file descriptor sets (which can be generated by
you can also load descriptors for messages and services that are linked into the current binary.
"What does it mean for messages and services to be linked in?" you may ask. It means your binary
imports a package that was generated by
protoc. When you generate Go code from your
sources, the resulting package has descriptor information embedded in it. The
desc package allows
you to easily extract those embedded descriptors.
Descriptors can also be acquired directly from
.proto source files (using the
or by programmatically constructing them (using the
protoparse package allows for parsing of
.proto source files into rich descriptors. Without
this package, you must invoke
protoc to either generate a file descriptor set file or to generate
Go code (which has descriptor information embedded in it). This package allows reading the source
directly without having to invoke
protoprint package allows for printing of descriptors to
.proto source files. This is
effectively the inverse of the
protoparse package. Combined with the
builder package, this
is a useful tool for programmatically generating protocol buffer sources.
builder package allows for programmatic construction of rich descriptors. Descriptors can
be constructed programmatically by creating trees of descriptor protos and using the
to link those into rich descriptors. But constructing a valid tree of descriptor protos is far from
So this package provides generous API to greatly simplify that task. It also allows for converting rich descriptors into builders, which means you can programmatically modify/tweak existing descriptors.
Dynamic Messages and Stubs
dynamic package provides a dynamic message implementation. It implements
is backed by a message descriptor and a map of fields->values, instead of a generated struct. This
is useful for acting generically with protocol buffer messages, without having to generate and link
in Go code for every kind of message. This is particularly useful for general-purpose tools that
need to operate on arbitrary protocol buffer schemas. This is made possible by having the tools load
descriptors at runtime.
There is also sub-package named
grpcdynamic, which provides a dynamic stub implementation. The stub can
be used to issue RPC methods using method descriptors instead of generated client interfaces.
gRPC Server Reflection
grpcreflect package provides an easy-to-use client for the
gRPC reflection service,
making it much easier to query for and work with the schemas of remote services.
It also provides some helper methods for querying for rich service descriptors for the services registered in a gRPC server.
Package codec contains a reader/write type that assists with encoding and decoding protobuf's binary representation.
|Package codec contains a reader/write type that assists with encoding and decoding protobuf's binary representation.
Package desc contains "rich descriptors" for protocol buffers.
|Package desc contains "rich descriptors" for protocol buffers.
Package builder contains a means of building and modifying proto descriptors programmatically.
|Package builder contains a means of building and modifying proto descriptors programmatically.
Package protoparse provides functionality for parsing *.proto source files into descriptors that can be used with other protoreflect packages, like dynamic messages and dynamic GRPC clients.
|Package protoparse provides functionality for parsing *.proto source files into descriptors that can be used with other protoreflect packages, like dynamic messages and dynamic GRPC clients.
Package ast defines types for modeling the AST (Abstract Syntax Tree) for the protocol buffers source language.
|Package ast defines types for modeling the AST (Abstract Syntax Tree) for the protocol buffers source language.
Package protoprint provides a mechanism to generate protobuf source code from descriptors.
|Package protoprint provides a mechanism to generate protobuf source code from descriptors.
Package sourceinfo provides the ability to register and query source code info for file descriptors that are compiled into the binary.
|Package sourceinfo provides the ability to register and query source code info for file descriptors that are compiled into the binary.
Command protoc-gen-gosrcinfo is a protoc plugin.
|Command protoc-gen-gosrcinfo is a protoc plugin.
Package dynamic provides an implementation for a dynamic protobuf message.
|Package dynamic provides an implementation for a dynamic protobuf message.
Package grpcdynamic provides a dynamic RPC stub.
|Package grpcdynamic provides a dynamic RPC stub.
Package msgregistry contains a registry of known message and enum types.
|Package msgregistry contains a registry of known message and enum types.
Package grpcreflect provides GRPC-specific extensions to protobuf reflection.
|Package grpcreflect provides GRPC-specific extensions to protobuf reflection.
Package internal contains some code that should not be exported but needs to be shared across more than one of the protoreflect sub-packages.
|Package internal contains some code that should not be exported but needs to be shared across more than one of the protoreflect sub-packages.