更方便的在微信公众号阅读文章可以关注公众号:海生的go花园
一、前言
在第三章,我们已经学会了使用protoc命令,生成go文件。代码如下:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
api/hello.proto
protoc命名需要列出 .proto文件,如果我们有多个文件,或者我们想多个文件夹,怎么办?
此时我们可以借助Makefile来,执行一些脚本,自动生成go代码。
二、使用Makefile来生成protoc命令。
我们在grpc-demo1目录新建一个Makefile文件。
touch Makefile
此时查看grpc-demo1目录,结构如下:
➜ grpc-demo1 git:(master) ✗ tree
.
├── Makefile
├── api
│ ├── hello.pb.go
│ ├── hello.proto
│ └── hello_grpc.pb.go
├── go.mod
└── go.sum
1 directory, 6 files
多了一个 Makefile文件。
我们生成一个make protoc命令,代码如下,写入到Makefile文件中。
protoc:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
api/hello.proto
写好后,我们在grpc-demo1目录执行下:
$ make protoc
此时这个make protoc命名代替了 protoc 命令一大堆参数,简化了我们的复杂度。
要生成go文件只要执行一下就行。
三、使用protoc把多个.proto文件编译成.go文件
我们再在 grpc-demo1/api目录下增加一个 user.proto文件,代码如下:
syntax = "proto3";
package user;
option go_package = "github/hisheng/grpc-demo1/api";
message user {
int64 id = 1;
string name = 2;
}
然后我们再使用 make protoc 命令来 生成.go文件。
此时我们把Makefile文件改成如下:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
api/hello.proto api/user.proto
把最后一行改成 api/hello.proto api/user.proto,就是增加一个api/user.proto文件。
再执行:
$ make protoc
发现api目录生成了一个 user.pb.go 文件。
四、Makefile优化protoc获取文件
如果再多个文件呢,难道每次新增,都要改一下这个命令吗?
结合Makefile语法,我们优化下,其实只要把这些文件当成一个变量就好了,然后再写一个shell脚本来获取这些.proto文件。
我们把Makefile文件替换如下;
ifeq ($(GOHOSTOS), windows)
Git_Bash= $(subst cmd\,bin\bash.exe,$(dir $(shell where git)))
API_PROTO_FILES=$(shell $(Git_Bash) -c "find api -name *.proto")
else
API_PROTO_FILES=$(shell find api -name *.proto)
endif
protoc:
protoc --go_out=. --go_opt=paths=source_relative \
--go-grpc_out=. --go-grpc_opt=paths=source_relative \
$(API_PROTO_FILES)
我们使用了$(API_PROTO_FILES)
变量代替了所有api目录下.proto,这样就算再增加其他的.proto文件,也不用改Makefile文件了。
我们把go文件都删掉,此时再执行下:
$ make protoc
完全没问题,生成了所有的文件。我们可以tree查看下:
➜ grpc-demo1 git:(master) ✗ tree
.
├── Makefile
├── api
│ ├── hello.pb.go
│ ├── hello.proto
│ ├── hello_grpc.pb.go
│ ├── user.pb.go
│ └── user.proto
├── go.mod
└── go.sum
1 directory, 8 files
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。