3 个版本 (破坏性更新)
0.3.0 | 2023年11月2日 |
---|---|
0.2.0 | 2022年8月23日 |
0.1.0 | 2022年7月7日 |
#75 in #tonic
每月 25,094 次下载
在 19 个 crate 中使用 (通过 grpc-build-core)
8KB
grpc-build
grpc-build
提供了一种灵活的方式来管理 protobuf 文件并生成 tonic 所需的 gRPC 代码。
它构建在 tonic_build 之上,并通过编译目录中的所有 protobuf 文件扩展其功能。除此之外,这个库还增加了一个功能:完整的 proto 名称注解。在需要使用全名(包 + 消息名)来标识 protobuf 消息的情况下,这可能很有用。因此,对于每个顶级 protobuf 消息,该库为其生成的结构体添加了一个方法,返回其完整的 proto 名称。
给定以下 protobuf 定义
// my_message.proto
package grpc_build;
message Message {}
该库将生成标准的 Rust 代码以及每个消息的额外 impl。
// Message.rs (generated)
struct Message {}
impl NamedMessage for Message {
/// This returns package (grpc-build) + message name (Message).
const NAME: &'static str = "grpc_build.MyMessage"
}
如果 protobuf 内容有效(值得 linting it),grpc-build
将负责 protobuf 导入,并生成 mod.rs
文件,以便编译器找到生成的代码。该文件将放置在 输出目录 中。
它既可以作为可以直接在项目中使用的库,也可以作为可以在 CI 管道中使用的二进制文件。
入门指南
作为二进制文件使用
获取 最新二进制发布版本 并在您的 CI 管道中使用它。
grpc-build build --in-dir="<protobuf directory>" --out-dir="<codegen>"
根据需要,您可以使用 --build-client
(-c
) 和 --build-server
(-s
) 标志生成 gRPC 客户端和/或服务器。
要覆盖输出目录的内容,请使用 --force
(-f
) 标志。
// both client and server, overwriting the existing protogen
grpc-build build -c -s --in-dir="<protobuf directory>" --out-dir="<codegen>" -f
作为库使用
最方便地使用 grpc_build
作为库的方式是利用 Rust 的 build.rs
文件。不要忘记将 grpc_build
添加到 构建依赖项 列表。
// 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();
}
如果您想设置高级编译选项(例如为生成的类型添加额外的 #[derive]
),请使用 build_with_config
函数,该函数暴露了底层的 tonic_build::Builder
。
更高级的使用方式是自己使用 get_protos
和 refactor
函数。以下示例几乎与上面的示例相同,只是您不会自动生成 NamedMessage
特性
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();
}
许可证
本项目遵循 MIT 许可证。
依赖关系
~1.5MB
~36K SLoC