topfans/backend/scripts/PROTO_COMPILATION_FIX.md
2026-04-07 22:29:48 +08:00

2.2 KiB
Raw Permalink Blame History

Proto 编译脚本修复说明

问题描述

之前的 compile-proto.sh 脚本在生成 proto 文件时会产生冗余的 github.com/topfans/backend/pkg/proto/ 目录结构,导致:

  1. IDE 报错 undefined: GetMyGalleryRequest 等类型未定义
  2. 生成文件散落在多个位置,需要手动移动和清理
  3. 如果脚本中断,会留下孤立的生成文件

根本原因

使用 --go_opt=module=$MODULE_PATHprotoc 会根据 proto 文件中的 go_package 选项创建完整的模块路径目录结构:

# 旧方式
protoc --proto_path=. \
  --go_out=. \
  --go_opt=module=github.com/topfans/backend \
  proto/gallery.proto

# 结果:生成到 github.com/topfans/backend/pkg/proto/gallery/

解决方案

改用 --proto_path=proto + --go_opt=paths=source_relative,让 protoc 直接输出到目标目录:

# 新方式
protoc --proto_path=proto \
  --proto_path=. \
  --go_out=pkg/proto/gallery \
  --go_opt=paths=source_relative \
  gallery.proto

# 结果:直接生成到 pkg/proto/gallery/

修复内容

1. 调整 protoc 命令参数

  • --proto_path=. 改为 --proto_path=proto(主路径)
  • 添加 --proto_path=.(用于解析 google/api 等依赖)
  • 将输出路径从 . 改为具体目标目录 pkg/proto/$name
  • 使用 paths=source_relative 替代 module=$MODULE_PATH

2. 增强清理逻辑

  • 清理 github.com/ 目录(如果存在)
  • 清理 proto/*.pb.goproto/*.triple.go(误生成的文件)
  • 清理 pkg/proto/*/proto/ 子目录paths=source_relative 的副作用)

3. 优化目录创建

  • 预先创建所有目标目录
  • 避免生成过程中的路径错误

使用方法

# 重新生成所有 proto 文件
cd backend
bash scripts/compile-proto.sh

验证结果

执行后应该:

  1. 所有文件直接生成到 pkg/proto/*/
  2. 不存在 github.com/ 目录
  3. 不存在 proto/*.pb.goproto/*.triple.go
  4. 不存在 pkg/proto/*/proto/ 子目录
  5. IDE 不再报类型未定义错误

注意事项

  • 如果手动执行 protoc 命令,请使用相同的参数格式
  • proto 文件中的 go_package 选项仍然保持不变
  • 生成的 Go 代码包名和导入路径不受影响