#grpc #tonic #proto

grpc-build-core

简化 gRPC 编译过程

3 个版本 (破坏性更新)

0.3.0 2023年11月2日
0.2.0 2022年8月23日
0.1.0 2022年7月7日

#1794 in 开发工具

Download history 5696/week @ 2024-04-14 6921/week @ 2024-04-21 5799/week @ 2024-04-28 6027/week @ 2024-05-05 6779/week @ 2024-05-12 7473/week @ 2024-05-19 5718/week @ 2024-05-26 9169/week @ 2024-06-02 6647/week @ 2024-06-09 4260/week @ 2024-06-16 6655/week @ 2024-06-23 5202/week @ 2024-06-30 5716/week @ 2024-07-07 7321/week @ 2024-07-14 8550/week @ 2024-07-21 9410/week @ 2024-07-28

30,997 每月下载量
18 crate 中使用

MIT 许可

12KB
143

grpc-build

grpc-build 提供了一种灵活的方式来管理 protobuf 文件,并生成由 tonic 需要的 gRPC 代码。

它建立在 tonic_build 的基础上,并通过编译目录中的所有 protobuf 文件来扩展其功能。除此之外,这个库还增加了一个新特性:完整的 proto 名称注解。在您希望使用全名(包名 + 消息名)来识别 protobuf 消息的情况下,这可能很有用。因此,对于每个顶级 protobuf 消息,该库为其生成的结构体添加了一个方法,以返回其完整的 proto 名称。

给定以下 protobuf 定义

// my_message.proto
package grpc_build;
message 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"
}

如果 protobuf 内容有效(值得 代码检查),则 grpc-build 将处理 protobuf 导入,并生成 mod.rs 文件,以便编译器找到生成的代码。此文件将放置在 输出目录 中。

它既可以作为一个库直接在项目中使用,也可以作为一个二进制文件用于 CI 流水线。

文档 - Crates.io

入门指南

作为二进制文件使用

获取 最新二进制发布版本 并将其用于您的 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_protosrefactor 函数。以下示例几乎与上面的示例相同,只是您不会自动获取 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 许可证 许可。

依赖关系

~2MB
~43K SLoC