常见问题
1. goctl 生成 gRPC 代码时 proto 使用规范
- 在使用 goctl 生成 gRPC 代码时,编写的所有 rpc 方法的请求体和响应体必须在主 proto 中声明 message,即不支持从外包外 message,以下是 不支持 的 import 示例:
syntax = "proto3";
package greet;
import "base.proto"
service demo{
rpc (base.DemoReq) returns (base.DemoResp);
}
正确写法
syntax = "proto3";
package greet;
message DemoReq{}
message DemoResp{}
service demo{
rpc (DemoReq) returns (DemoResp);
}
- 在满足 1 的情况,proto import 只支持 message 引入,不支持 service 引入。
2. 为什么使用 goctl 生成 gRPC 代码时 proto 不支持使用包外 proto 和 service?
对于包外的 proto,goctl 没法完全控制,有几个问题 goctl 没法解决:
- 包外的 proto 如果层级很深,亦或在其他公共仓库中,goctl 没法确定包外 proto 是否已经生成了 pb.go
- 如果包外的 proto 生成了 pb.go,那些 pb.go 生成在哪些目录下,是否在同一个工程中,如果在当前工程外,pb.go 所在工程是否使用了 go module 等等,goctl 没法得知,因此没法定位到其真正的 go package。
- 如果包外的 proto 没有生成,既然其属于公共 proto,那么 goctl 是否需要针对每次引入都要生成,这个也无从解决
3. goctl 生成 gRPC 不支持 google/protobuf/empty.proto
包的 import
答案,同 1,2