求推荐可筛选特定注解RPC并修改Protobuf文件的工具
处理Protobuf RPC过滤与轻量TS生成的工具方案
针对你批量处理Protobuf文件、仅保留带特定选项的RPC并生成轻量TypeScript代码的需求,以下是几个实用的工具和实现思路:
1. Protobuf.js(前端友好,快速实现)
这是Node.js生态中常用的Protobuf处理库,支持解析Protobuf AST、修改服务定义,直接生成TypeScript代码,适合前端项目快速落地需求。
核心步骤:
- 先加载自定义选项的Protobuf定义(确保能正确解析
my_option) - 遍历目标服务的所有RPC方法,过滤出带有
expose_for_web: true的方法 - 替换原服务的方法列表后,直接生成TS代码
示例代码片段:
const protobuf = require("protobufjs"); const fs = require("fs").promises; async function filterAndGenerateTS(protoPath, optionProtoPath, outputPath) { // 加载自定义选项的proto定义 const optionRoot = await protobuf.load(optionProtoPath); const myOption = optionRoot.lookupType("your.package.MyOption"); protobuf.util.setOption(myOption, "my_option", myOption); // 加载目标业务proto文件 const root = await protobuf.load(protoPath); const service = root.lookupService("your.service.v1.YourService"); // 过滤RPC方法:仅保留符合条件的 service.methods = Object.fromEntries( Object.entries(service.methods).filter(([_, method]) => { const option = method.options?.get("my_option"); return option?.expose_for_web === true; }) ); // 生成TypeScript代码 const tsCode = protobuf.generate(root, { target: "ts", format: "es6", keepCase: true }); // 写入输出文件 await fs.writeFile(outputPath, tsCode); } // 调用示例 filterAndGenerateTS( "./your/service.proto", "./your/my_option.proto", "./output/service.ts" );
2. Buf(大规模项目首选)
Buf是现代Protobuf管理工具,支持自定义插件、批量处理、依赖管理,适合有大量Protobuf文件的大型项目。你可以编写Go语言插件来过滤RPC方法,再配合Buf的构建流程生成最终的TS代码。
核心思路:
- 编写Buf插件(Go语言),遍历每个Protobuf文件的服务,过滤保留符合条件的RPC
- 通过
buf build命令运行插件,生成处理后的Protobuf文件 - 用官方的
protoc-gen-ts插件基于处理后的Protobuf生成轻量TS代码
插件核心逻辑示例(Go):
package main import ( "google.golang.org/protobuf/compiler/protogen" "google.golang.org/protobuf/proto" "your/project/proto/my_option" // 导入自定义选项生成的Go代码 ) func main() { protogen.Options{}.Run(func(gen *protogen.Plugin) error { for _, f := range gen.Files { if !f.Generate { continue } // 遍历文件内的所有服务 for _, service := range f.Services { filteredMethods := make([]*protogen.Method, 0, len(service.Methods)) for _, method := range service.Methods { // 解析自定义选项 opt := &my_option.MyOption{} if err := proto.Unmarshal(method.Desc.Options(), opt); err == nil && opt.ExposeForWeb { filteredMethods = append(filteredMethods, method) } } // 替换服务的方法列表为过滤后的结果 service.Methods = filteredMethods } // 生成修改后的Protobuf文件(供后续TS代码生成使用) g := gen.NewGeneratedFile(f.GeneratedFilenamePrefix+".filtered.proto", f.GoImportPath) g.P(f.Content) } return nil }) }
3. Protoc + 自定义TS生成插件
基于官方protoc编译器,修改或扩展现有的protoc-gen-ts插件,在代码生成阶段直接过滤掉不符合条件的RPC方法,无需修改原始Protobuf文件。
优势:
- 不改动源Protobuf文件,仅在代码生成环节做过滤,适合需要保留源文件完整性的场景
- 可以直接复用现有TS生成插件的逻辑,只增加过滤判断
核心修改点:
在TS生成插件的服务处理逻辑中,添加判断:仅当RPC方法带有expose_for_web: true选项时,才生成对应的客户端调用代码、类型定义。
注意事项
- 处理自定义选项时,必须确保加载了对应的Protobuf定义文件,否则无法正确解析选项值
- 大规模项目优先选择Buf或Protoc插件方案,能高效批量处理所有Protobuf文件
- 如果只需要生成轻量TS代码,建议在代码生成阶段过滤,避免修改原始Protobuf文件带来的版本管理问题
内容的提问来源于stack exchange,提问作者Mehdi Pourfar
相关产品推荐
相关产品推荐

