环境信息
- goctl 版本: 1.9.2
- 操作系统: Windows 10
- Go 版本: 1.25.5
项目结构
zero-rpc/
├── go.work
├── sales-admin/ # RPC 服务端
│ ├── go.mod # module sales-admin
│ ├── protoc/
│ │ └── admin.proto
│ └── adminClient/
│ └── admin.go # goctl 生成的客户端代码
├── sales-app/ # 另一个 RPC 服务端
│ └── go.mod # module sales-app
└── sales-center/ # 中央 proto 仓库(存储公用桩代码)
├── go.mod # module sales-center
└── gen/
└── admin/
├── admin.pb.go
└── admin_grpc.pb.go
执行命令
在 sales-admin 目录下执行:
goctl rpc protoc protoc/admin.proto --go_out=../sales-center --go-grpc_out=../sales-center --zrpc_out=. --style=goZero
Proto 文件
syntax = "proto3";
package admin;
option go_package = "../sales-center/gen/admin";
service Admin {
rpc GetUser (GetUserReq) returns (GetUserResp);
}
问题现象
生成的 sales-admin/adminClient/admin.go 文件中,导入路径出现了错误的本地文件系统路径:
package adminClient
import (
"context"
"sales-admin/F:/coding/learn/zero-rpc/sales-center/gen/admin" // ❌ 错误:混合了模块名和本地路径
"github.com/zeromicro/go-zero/zrpc"
"google.golang.org/grpc"
)
期望行为
生成的导入路径应该是纯模块引用:
import (
"sales-center/gen/admin" // ✅ 正确:纯包引用
)
根本原因分析
- option go_package 使用了相对路径 ../sales-center/gen/admin
- goctl 在解析时,将本地文件系统绝对路径(F:/coding/learn/zero-rpc/sales-center/gen/admin)错误地拼接到当前模块名(sales-admin)后面
- 正确行为应该是识别出输出目录 ../sales-center 属于 sales-center 模块,并使用该模块名作为导入前缀
临时解决方案
手动修改生成的 adminClient/admin.go,将导入路径改为:
"sales-center/gen/admin"
建议
在使用中央 proto 仓库模式时,option go_package 应支持或建议使用完整的模块路径格式,例如:
option go_package = "sales-center/gen/admin";
goctl 应该能够:
- 识别 --go_out 输出目录所属的 Go 模块
- 自动将包引用转换为正确的模块路径引用

环境信息
项目结构
zero-rpc/
├── go.work
├── sales-admin/ # RPC 服务端
│ ├── go.mod # module sales-admin
│ ├── protoc/
│ │ └── admin.proto
│ └── adminClient/
│ └── admin.go # goctl 生成的客户端代码
├── sales-app/ # 另一个 RPC 服务端
│ └── go.mod # module sales-app
└── sales-center/ # 中央 proto 仓库(存储公用桩代码)
├── go.mod # module sales-center
└── gen/
└── admin/
├── admin.pb.go
└── admin_grpc.pb.go
执行命令
在 sales-admin 目录下执行:
goctl rpc protoc protoc/admin.proto --go_out=../sales-center --go-grpc_out=../sales-center --zrpc_out=. --style=goZero
Proto 文件
syntax = "proto3";
package admin;
option go_package = "../sales-center/gen/admin";
service Admin {
rpc GetUser (GetUserReq) returns (GetUserResp);
}
问题现象
生成的 sales-admin/adminClient/admin.go 文件中,导入路径出现了错误的本地文件系统路径:
package adminClient
import (
"context"
)
期望行为
生成的导入路径应该是纯模块引用:
import (
"sales-center/gen/admin" // ✅ 正确:纯包引用
)
根本原因分析
临时解决方案
手动修改生成的 adminClient/admin.go,将导入路径改为:
"sales-center/gen/admin"
建议
在使用中央 proto 仓库模式时,option go_package 应支持或建议使用完整的模块路径格式,例如:
option go_package = "sales-center/gen/admin";
goctl 应该能够: