使用宏而不是www.example.com生成Rust protobuf代码build.rs

sf6xfgos  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(156)

有几个Rust crate支持protobufs,但它们都需要在www.example.com阶段运行代码生成build.rs。
有没有可能在没有额外构建步骤的情况下生成protobuf序列化代码?我看到两种方法:

  • 使用类似Serde的方法,声明结构体,可能还有一些派生或其他宏,用户实际写出的地方--这可能不适合任意的protobuf序列化,因为.proto文件可能与用户编写的结构体不匹配。
  • 使用一些神奇的“基于宏的内联编译器”,其中用户编写一些神奇的

protobuf!(include_str!("my_protobuf.proto"))
并生成所有需要的代码内联,而不涉及一个单独的build.rs魔术。这是不可能的东西在所有?或者对这种方法的一些负面影响?或者只是还没完成?

xuo3flqw

xuo3flqw1#

大多数板条箱不使用类似Serde的方法的原因是序列化protobufs需要额外的数据,而这些数据不是结构的一部分,即字段的ID。因为Serde没有提供公开该功能的方法,而且大多数人也不想编写像Serde已经提供的那样的通用解析功能,所以通常这种方法并不有效。
理论上可以使用宏来生成protobuf代码。然而,正如注解中提到的,这效率要低得多,因为它必须在每次编译时执行,而不是缓存。在大型项目中,Rust的编译时间已经很慢,所以最好尽量避免重新编译。

相关问题