如何通过tonic_build仅为同包枚举添加编译时注解?
解决方案
要实现给指定包下的枚举额外添加strum::EnumString注解,同时保持所有类型都带有serde的derive,可以通过tonic_build的条件属性匹配来完成:
1. 配置build.rs
在项目的build.rs中,利用tonic_build::configure()的type_attribute方法,结合闭包精准匹配目标枚举:
fn main() -> Result<(), Box<dyn std::error::Error>> { tonic_build::configure() // 为所有类型添加serde序列化/反序列化derive .type_attribute(".", "#[derive(serde::Serialize, serde::Deserialize)]") // 仅为foo.bar包下的枚举添加strum::EnumString .type_attribute( |metadata| { metadata.package == "foo.bar" && metadata.kind == prost_build::TypeKind::Enum }, "#[derive(strum::EnumString)]", ) .compile(&["proto/your_proto_file.proto"], &["proto"])?; Ok(()) }
2. 依赖配置
确保Cargo.toml中包含所需依赖:
[dependencies] tonic = "0.10" prost = "0.12" serde = { version = "1.0", features = ["derive"] } strum = "0.25" strum_macros = "0.25" [build-dependencies] tonic-build = "0.10"
效果说明
生成的Rust代码会完全符合预期:
- 结构体
A仅带有serde相关derive:#[derive(serde::Serialize, serde::Deserialize)] - 枚举
Enu同时包含serde和strum的derive:#[derive(serde::Serialize, serde::Deserialize, strum::EnumString)]
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

