2.2 KiB
2.2 KiB
Proto 编译脚本修复说明
问题描述
之前的 compile-proto.sh 脚本在生成 proto 文件时会产生冗余的 github.com/topfans/backend/pkg/proto/ 目录结构,导致:
- IDE 报错
undefined: GetMyGalleryRequest等类型未定义 - 生成文件散落在多个位置,需要手动移动和清理
- 如果脚本中断,会留下孤立的生成文件
根本原因
使用 --go_opt=module=$MODULE_PATH 时,protoc 会根据 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.go和proto/*.triple.go(误生成的文件) - 清理
pkg/proto/*/proto/子目录(paths=source_relative 的副作用)
3. 优化目录创建
- 预先创建所有目标目录
- 避免生成过程中的路径错误
使用方法
# 重新生成所有 proto 文件
cd backend
bash scripts/compile-proto.sh
验证结果
执行后应该:
- ✅ 所有文件直接生成到
pkg/proto/*/下 - ✅ 不存在
github.com/目录 - ✅ 不存在
proto/*.pb.go或proto/*.triple.go - ✅ 不存在
pkg/proto/*/proto/子目录 - ✅ IDE 不再报类型未定义错误
注意事项
- 如果手动执行
protoc命令,请使用相同的参数格式 - proto 文件中的
go_package选项仍然保持不变 - 生成的 Go 代码包名和导入路径不受影响