#protobuf #protoc-gen-rust #build #build-script #proto #codegen #serialization

构建 protobuf-codegen

rust-protobuf 的代码生成器。包括一个库,可以编程调用(例如从 build.rs)以及 protoc-gen-rust 二进制文件。

76 个稳定版本

3.5.1 2024 年 8 月 19 日
3.5.0 2024 年 6 月 26 日
3.4.0 2024 年 2 月 26 日
3.3.0 2023 年 10 月 2 日
1.6.0 2018 年 5 月 11 日

#18 in 开发工具

Download history 103579/week @ 2024-04-29 106564/week @ 2024-05-06 109746/week @ 2024-05-13 120791/week @ 2024-05-20 106721/week @ 2024-05-27 105234/week @ 2024-06-03 118685/week @ 2024-06-10 103289/week @ 2024-06-17 117681/week @ 2024-06-24 113641/week @ 2024-07-01 116575/week @ 2024-07-08 102759/week @ 2024-07-15 96131/week @ 2024-07-22 105955/week @ 2024-07-29 108155/week @ 2024-08-05 104379/week @ 2024-08-12

419,440 每月下载次数
用于 363 个包 (77 直接)

MIT 许可证

2MB
40K SLoC

protobuf 包的 Protobuf 代码生成器

此包主要从 build.rs 脚本中生成 .rs 文件时使用。

如何生成代码

.proto 文件生成 .rs 文件主要有三种主要方式

  • 使用 protoc 命令行工具和 protoc-gen-rust 插件
  • 使用此包 Codegen 与纯 Rust 解析器
  • 使用此包 Codegenprotoc 解析器

您应该使用哪种取决于您的需求。

如果您使用非 cargo 构建系统(如 Bazel),您可能更喜欢使用 protoc-gen-rust 插件。

如果您使用 cargo 构建,您可能希望使用此包中的 Codegen

Protoc 解析器与纯 Rust 解析器

此包可以插入两个 protobuf 解析器

  • protoc-基于的解析器(protoc 是 Google protobuf 的命令行工具)
  • 纯 Rust 解析器(protobuf-parse crate)

protoc-基于的解析器预计可以非常正确地解析 .proto 文件:所有 Google 的 protobuf 实现都依赖于它。

尽管在 protobuf-parse 中没有已知错误,但它没有得到很好的测试。此外,protobuf-parse 没有实现 .proto 解析器的一些很少使用的功能,主要是 .proto 文件中指定的复杂消息选项。我从未见过有人使用它们,但您已经被警告。

注意,可以从 protoc-bin-vendored crate 获取 protoc 命令。

示例

// Use this in build.rs
protobuf_codegen::Codegen::new()
    // Use `protoc` parser, optional.
    .protoc()
    // Use `protoc-bin-vendored` bundled protoc command, optional.
    .protoc_path(&protoc_bin_vendored::protoc_bin_path().unwrap())
    // All inputs and imports from the inputs must reside in `includes` directories.
    .includes(&["src/protos"])
    // Inputs must reside in some of include paths.
    .input("src/protos/apple.proto")
    .input("src/protos/banana.proto")
    // Specify output directory relative to Cargo output directory.
    .cargo_out_dir("protos")
    .run_from_script();

如何使用 protoc-gen-rust

如果需要的话。

(注意,可以通过 protoc crate 以编程方式调用 protoc

  1. protoc 二进制文件安装 protobuf。

在 OS X 上,可以使用 Homebrew

brew install protobuf

在 Ubuntu 上,可以安装 protobuf-compiler

apt-get install protobuf-compiler

Protobuf 仅用于代码生成,rust-protobuf 运行时不需要 C++ protobuf 库。

  1. 安装 protoc-gen-rust 程序(它是 protoc 插件)

可以从源代码安装或使用 cargo install protobuf-codegen 命令安装。

  1. protoc-gen-rust 添加到 $PATH

如果您使用 cargo 安装,应该是这样的

PATH="$HOME/.cargo/bin:$PATH"
  1. 生成 .rs 文件
protoc --rust_out . foo.proto

这将在当前目录中生成 .rs 文件。

自定义生成代码

有时生成的代码需要调整,例如,以拥有自定义的 derive。

rust-protobuf 提供了两种方法来实现这一点

  • 生成的 .rs 文件包含 @@protoc_insertion_point(...) 标记(类似于 Google 的 protobuf 生成器为 C++ 或 Java 插入的标记)。可以使用简单的 sed 单行脚本来用自定义注解替换这些标记。
  • Codegen::customize_callback 可以在从 build.rs 脚本调用时用来修补生成的代码。

Serde

从版本 3 开始,rust-protobuf 不再直接支持 serde。

Rust-protobuf 3 完全支持

这涵盖了大部分 serde 用例。

如果您仍然需要 serde,可以使用通用的自定义回调(见上文)来插入 #[serde(...)] 注解。

在 rust-protobuf 存储库中的 示例项目 展示了如何实现它。

依赖关系

~5–15MB
~202K SLoC