如何通过tonic_build为生成的Rust文件添加serde的use语句?
解决方案
要在tonic生成的Rust文件中自动添加use serde::{Serialize, Deserialize};语句,你需要借助tonic_build底层依赖的prost_build提供的prepend_module_content方法,直接往生成的模块顶部插入所需的use声明。
具体实现代码
在你的build.rs中按如下方式配置:
fn main() -> Result<(), Box<dyn std::error::Error>> { let mut builder = tonic_build::configure(); // 为HelloRequest结构体添加serde的Derive属性 builder = builder.type_attribute("HelloRequest", "#[derive(serde::Serialize, serde::Deserialize)]"); // 往生成的模块顶部插入use语句 builder.prost_build_config().prepend_module_content( "use serde::{Serialize, Deserialize};" ); // 编译指定的proto文件 builder.compile(&["proto/hello.proto"], &["proto/"])?; Ok(()) }
为什么server_mod_attribute不生效?
server_mod_attribute仅作用于tonic生成的服务端模块(比如HelloServiceServer所在的模块),用来给该模块添加属性,而非给所有生成的结构体所在的根模块插入use语句,所以你的尝试不会生效。
额外注意点
- 确保
Cargo.toml中已添加正确的依赖:[dependencies] serde = { version = "1.0", features = ["derive"] } tonic = "0.9" prost = "0.12" - 若要给所有生成的结构体批量添加serde Derive,可以用通配符:
builder = builder.type_attribute("*", "#[derive(serde::Serialize, serde::Deserialize)]");
内容的提问来源于stack exchange,提问作者Silva
相关产品推荐
相关产品推荐

