2

更方便的在微信公众号阅读文章可以关注公众号:海生的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

海生
104 声望32 粉丝

与黑夜里,追求那一抹萤火。