#proto #grpc #tonic

grpc-build-derive

简化 gPRC 编译过程

3 个版本 (破坏性更新)

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

#75 in #tonic

Download history 7649/week @ 2024-03-14 5368/week @ 2024-03-21 6768/week @ 2024-03-28 8282/week @ 2024-04-04 6559/week @ 2024-04-11 6551/week @ 2024-04-18 6342/week @ 2024-04-25 6143/week @ 2024-05-02 5965/week @ 2024-05-09 7191/week @ 2024-05-16 6147/week @ 2024-05-23 8542/week @ 2024-05-30 7191/week @ 2024-06-06 5804/week @ 2024-06-13 5680/week @ 2024-06-20 4427/week @ 2024-06-27

每月 25,094 次下载
19 个 crate 中使用 (通过 grpc-build-core)

MIT 许可证

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 管道中使用的二进制文件。

文档 - 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 许可证

依赖关系

~1.5MB
~36K SLoC