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