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