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

83 lines
2.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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 代码包名和导入路径不受影响