流程
解析 proto 文件,生成客户端和服务器需要的协议文件
安装
# 安装可执行二进制到 $GOPATH/bin
go install .
基本使用
protoc --idmsg_out=. proto/*.proto
# 生成 v1 版本的协议
protoc --idmsg_out=v1:. proto/*.proto
即可在当前目录输出 msg.go 和 msg.ts
调试
- 在项目里运行时,带上
allow_save 即可在当前目录生成 req.bin,如: protoc --idmsg_out=allow_save=. proto/*.proto
- 使用
-f req.bin 启动项目,即可进行调试
生成文件内容
msg.ts 按照 code 码排序
// Code generated by protoc-gen-idmsg. DO NOT EDIT.
let Protocol = {
HEARTBEAT: "/v1/heartbeat",
LOGIN: "/base/login",
COSTUME_LIST: "/v1/item/add",
ACTOR_UPDATE: "/v1/actor/update",
}
export Protocol
let ProtocolRouter = {} // 协议名:[code, req, rsp]
ProtocolRouter[Protocol.HEARTBEAT] = [800, "Empty", "Empty"]
ProtocolRouter[Protocol.LOGIN] = [1000, "BaseLoginReq", "LoginRsp"]
ProtocolRouter[Protocol.COSTUME_LIST] = [2001, "ItemUpdate", "Empty"]
ProtocolRouter[Protocol.ACTOR_UPDATE] = [4001, "ActorUpdateReq", "Actor"]
export ProtocolRouter
let ProtocolId = {} // 协议id: [router, req, rsp]
ProtocolRouter[800] = [Protocol.HEARTBEAT, "Empty", "Empty"]
ProtocolRouter[1000] = [Protocol.LOGIN, "BaseLoginReq", "LoginRsp"]
ProtocolRouter[2001] = [Protocol.COSTUME_LIST, "ItemUpdate", "Empty"]
ProtocolRouter[4001] = [Protocol.ACTOR_UPDATE, "ActorUpdateReq", "Actor"]
export ProtocolId
msg.go 按照字符序
// Code generated by protoc-gen-idmsg. DO NOT EDIT.
package pb
import (
"google.golang.org/protobuf/proto"
"gs-go/core/msgdef"
)
var (
MethodRouter = map[string]*msgdef.MethodItem{
"/v1/base/login": {Method: "Base.BaseLogin", Auth: 0, Cmd: int32(CMD_LOGIN)},
"/v1/server/info": {Method: "Game.ServerInfo", Auth: 0, Cmd: int32(CMD_SERVER_INFO)},
}
IdMsg = map[int32]*msgdef.ReqItem{
int32(CMD_LOGIN): {Req: func() proto.Message { return &BaseLoginReq{} }, Rsp: func() proto.Message { return &LoginRsp{} }, Auth: 0, Name: "/v1/base/login"},
int32(CMD_SERVER_INFO): {Req: func() proto.Message { return &ServerInfoReq{} }, Rsp: func() proto.Message { return &ServerInfoRsp{} }, Auth: 0, Name: "/v1/server/info"},
}
)
type MsgDefStruct struct{}
func (m *MsgDefStruct) GetMethodRouter() map[string]*msgdef.MethodItem {
return MethodRouter
}
func (m *MsgDefStruct) GetIdMsg() map[int32]*msgdef.ReqItem {
return IdMsg
}
var MsgDef = &MsgDefStruct{}
原理解释
protoc 会对 proto 文件进行分析,得到语法树,解析成 CodeGeneratorRequest, 返回 CodeGeneratorResponse