Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/stefandanaita/grpc-build
Easy gRPC compilation for Rust
https://github.com/stefandanaita/grpc-build
grpc protobuf rpc rust rust-lang rust-library
Last synced: 3 days ago
JSON representation
Easy gRPC compilation for Rust
- Host: GitHub
- URL: https://github.com/stefandanaita/grpc-build
- Owner: stefandanaita
- License: mit
- Created: 2020-06-04T17:06:29.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2024-12-09T15:49:45.000Z (about 1 month ago)
- Last Synced: 2025-01-12T06:05:24.201Z (11 days ago)
- Topics: grpc, protobuf, rpc, rust, rust-lang, rust-library
- Language: Rust
- Homepage: https://docs.rs/grpc-build
- Size: 97.7 KB
- Stars: 16
- Watchers: 3
- Forks: 13
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# grpc-build
`grpc-build` provides an flexible way to manage protobuf files and generate the gRPC code required by [tonic](https://github.com/hyperium/tonic).
It is built on top of [tonic_build](https://github.com/hyperium/tonic/tree/master/tonic-build) and it extends its functionality by compiling all the protobuf files inside a directory.
In addition to that, this library adds another feature: full proto name annotation.
This could be useful in cases where you want use the full name (package + message name) to identify a protobuf message.
Therefore, for each top-level protobuf message this library adds a method to its generated struct returning its full proto name.Given the following protobuf definition:
```protobuf
// my_message.proto
package grpc_build;
message Message {}
```The library will generate the standard Rust code plus the extra impl for each message.
```rust
// Message.rs (generated)
struct Message {}impl NamedMessage for Message {
/// This returns package (grpc-build) + message name (Message).
const NAME: &'static str = "grpc_build.MyMessage"
}
```If the protobuf content is valid (worth [linting it](https://buf.build/docs/tour-4)), `grpc-build` will take care of the protobuf imports and it will also generate the `mod.rs` file to allow the compiler to find the generated code. This file will be placed inside the *output directory*.
It comes both as a library that can be used directly inside a project and as a binary that can be used in CI pipelines.
[Documentation](https://docs.rs/grpc-build) - [Crates.io](https://crates.io/crates/grpc-build)
## Getting started
### Using it as a binary
Get the [latest binary release](https://github.com/stefandanaita/grpc-build/releases) and use it inside your CI pipeline.```
grpc-build build --in-dir="" --out-dir=""
```Depending on the requirements, you can generate the gRPC Client and/or Server by using the `--build-client` (`-c`) and `--build-server` (`-s`) flags.
To overwrite the contents of the output directory, use the `--force` (`-f`) flag.
```
// both client and server, overwriting the existing protogen
grpc-build build -c -s --in-dir="" --out-dir="" -f
```### Using it as a library
The most convenient way of using `grpc_build` as a library is by taking advantage of Rust's `build.rs` file. Don't forget to add `grpc_build` to the [build-dependencies](https://doc.rust-lang.org/cargo/reference/specifying-dependencies.html#build-dependencies) list.
```rust
// build.rs
use grpc_build::Builder;fn main() {
Builder::new()
.build_client(true)
.build_server(true)
.force(true)
.out_dir("src/protogen")
.build("protos")
.unwrap();
}
```If you want to set advanced compilation options (like an additional `#[derive]` for the generated types), use the `build_with_config` function, which exposes the underlying [`tonic_build::Builder`](https://docs.rs/tonic-build/0.5.0/tonic_build/struct.Builder.html).
A more advanced usage is to use the `get_protos` and `refactor` functions yourself. The following example does almost the same as the example above, except you don't get the `NamedMessage` traits auto derived
```rust
fn main() {
let proto_src_dir = "protos";
let proto_out_dir = "src/protogen";let protos: Vec<_> = crate::base::get_protos(proto_src_dir).collect();
grpc_build::prepare_out_dir(proto_out_dir).unwrap();
tonic_build::configure()
.out_dir(proto_out_dir)
.build_server(true)
.build_client(true)
.compile(&protos, &["."])
.unwrap();grpc_build::refactor(proto_out_dir).unwrap();
}
```## License
This project is licensed under the [MIT license](https://github.com/stefandanaita/grpc-build/blob/master/LICENSE).