You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求推荐可筛选特定注解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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 19:31:35