通过api文件生成proto文件。
go install github.com/pigfu/goctl-proto/cmd/goctl-proto@latest
当前目录下有一个api文件service.api,内容如下:
syntax = "v1"
type Mock {
Id int64 `json:"id,optional"` // ID
Name string `json:"name,optional"` // 名称
Type int32 `json:"type,optional"` // 类型
Tags []string `json:"tags,optional"` // 标签列表
ExtraInfos map[string]*ExtraInfo `json:"extra_infos,optional"` // 额外信息
}
type ExtraInfo {
Content string `json:"content,optional"` // 内容
}
service mocker-api {
@doc "创建"
@handler CreateMock
post /create (Mock) returns (Mock)
}
使用goctl-proto生成proto文件的命令:
goctl-proto proto --input ./service.api --output .
或者配合goctl插件命令使用:
goctl api plugin -plugin goctl-proto="proto" -api ./service.api -dir .
在当前目录下就得到了一个service.proto文件,内容如下:
syntax = "proto3";
package mocker.api;
option go_package = "/mocker-apiPb";
message ExtraInfo {
string Content = 1;// 内容
}
message Mock {
int64 Id = 1;// ID
string Name = 2;// 名称
int32 Type = 3; // 类型
repeated string Tags = 4;// 标签列表
map<string,ExtraInfo> ExtraInfos = 5;// 额外信息
}
service MockerApi {
// 创建
rpc CreateMock (Mock) returns (Mock);
}
使用该proto文件即可调用goctl的rpc命令生成rpc代码:
goctl rpc protoc ./service.proto --go_out=./service --go-grpc_out=./service --zrpc_out=./service --client=true
更多示例点击此处。
-
支持生成的protobuf只支持proto3。
-
一些在protobuf中不存在/不支持的数据类型会转换为bytes,例如interface{}、any等等。
-
不支持按照api中的import的文件分别生成proto文件,并且不会生成类似google.protobuf.Any和google.protobuf.Empty这种类型的数据类型,但不排除以后支持,原因见这里。
-
在api文件中声明的type类型的备注信息不会被复制到proto文件中,原因是目前使用的goctl v1.6.5并没有支持解析这类备注,但不排除以后支持。
-
所有protobuf的map键不支持的类型会转化为string,不支持的值会转化为bytes,例如map[float32][]string会转为map<string,bytes>
- 支持对proto中的service分组 ✅
- 支持导出字段除json外的其余tag
- 导出rpc时更深度的清理未被使用的message ✅
- 支持导出描述信息中包含@goctl-proto的rpc ✅