🐱‍👓PowerProto: gRPC工具链(protoc, protoc-gen-go)的一键安装与版本控制

goreport.pngtotalline.pnglastcommit.pnggodoc.png

中文 | English

exmaple.gif

项目地址:🎉 An awesome version control tool for protoc and its related plugins. (github.com)

PowerProto首要用于处理下面三个问题:

  1. 下降gRPC的运用门槛与运用本钱。
  2. 处理protoc以及其相关插件(比方protoc-gen-go、protoc-gen-grpc-gateway)的版别操控问题。
  3. 高效办理proto的编译,完结多渠道兼容、一键装置与编译。

🎉 功能

  1. 完结protoc的一键装置与多版别办理。
  2. 完结protoc相关插件(比方protoc-gen-go)的一键装置与多版别办理。
  3. 经过装备文件办理proto的编译,而非shell脚本,提高可读性与兼容性。
  4. 引导式生成装备文件,跨渠道兼容,一份装备在多个渠道均能够完结一键编译。
  5. 支撑批量、递归编译proto文件,提高效率
  6. 跨渠道支撑PostAction,能够在编译完结之后履行一些惯例操作(比方替换掉一切生成文件中的”omitempty”)。
  7. 支撑PostShell,在编译完结之后履行特定的shell脚本。
  8. 支撑 google api 的一键装置与版别操控。

装置与依靠

一、经过Go进行装置

直接履行下面的指令即可进行装置:

go install github.com/storyicon/powerproto/cmd/powerproto@latest

二、开箱即用版别

能够经过 Github Release Page 下载开箱即用版别。

指令介绍

你能够经过 powerproto -h 来检查帮助,比方:

powerproto -h
powerproto init -h
powerproto tidy -h
powerproto build -h
powerproto env -h

它的好处是指令行中的文档永久和你的二进制版别保持一致。而Github上的文档可能会一直是对应最新的二进制。

一、初始化装备

能够经过下面的指令进行装备的初始化:

powerproto init

二、收拾装备

能够经过下面的指令收拾装备:

powerproto tidy

它将会从当时目录开端向父级目录搜索名为 powerproto.yaml 的装备文件,并对装备进行读取和收拾。

你也能够指定收拾哪个装备文件:

powerproto tidy [the path of proto file]

收拾装备首要包含两个操作:

  1. 经过查询,将版别中的latest替换为真实的最新版别号。
  2. 装置装备文件中界说的一切依靠。

支撑经过 -d 参数来进入到debug形式,检查更具体的日志。

三、编译Proto文件

能够经过下面的指令进行Proto文件的编译:

// 编译指定的proto文件
powerproto build xxxx.proto
// 编译当时目录下的一切proto文件
powerproto build .
// 递归编译当时目录下的一切proto文件,包括子文件夹。
powerproto build -r .

支撑经过 -d 参数来进入到debug形式,检查更具体的日志。
支撑经过 -y 参数来进入到dryRun形式,只打印指令而不真实履行,这关于调试十分有用。

四、检查环境变量

假如你的指令一直卡在某个状况,大概率是出现网络问题了。
你能够经过下面的指令来检查环境变量是否装备成功:

powerproto env

示例

比方你在 /mnt/data/hello 目录下具有下面这样的文件结构:

$ pwd
/mnt/data/hello
$ tree
./apis
└── hello.proto
powerproto.yaml

powerproto.yaml 的文件内容是(你能够经过 powerproto init 指令很便利的生成装备文件):

scopes:
- ./
protoc: latest
protocWorkDir: ""
plugins:
protoc-gen-go: google.golang.org/protobuf/cmd/protoc-gen-go@latest
protoc-gen-go-grpc: google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest
options:
- --go_out=.
- --go_opt=paths=source_relative
- --go-grpc_out=.
- --go-grpc_opt=paths=source_relative
importPaths:
- .
- $GOPATH
- $POWERPROTO_INCLUDE
postActions: []
postShell: ""

在任意目录履行:

powerproto build -r /mnt/data/hello/apis

你都能够得到编译后的文件

$ pwd
/mnt/data/hello
$ tree
./apis
├── hello.pb.go
├── hello.proto
└── hello_grpc.pb.go
powerproto.yaml

它相当于你在 powerproto.yaml 地点目录,履行:

$POWERPROTO_HOME/protoc/3.17.3/protoc --go_out=. \
--go_opt=paths=source_relative \
--go-grpc_out=. \
--go-grpc_opt=paths=source_relative \
--proto_path=/mnt/data/hello \
--proto_path=$GOPATH \
--proto_path=$POWERPROTO_HOME/include \
--plugin=protoc-gen-go=$POWERPROTO_HOME/plugins/google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.1/protoc-gen-go \
--plugin=protoc-gen-go-grpc=$POWERPROTO_HOME/plugins/google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0/protoc-gen-go-grpc
/mnt/data/hello/apis/hello.proto

装备文件

装备文件用于描绘编译proto文件时,各种依靠的版别以及参数等。

能够便利的经过 powerproto init进行装备文件的初始化。

解说

以下面这份装备文件为例:

# 必填,scopes 用于界说效果域,即当时装备项对项目中的哪些目录生效
scopes:
- ./
# 必填,protoc的版别,能够填 latest,会主动转换成最新的版别
protoc: 3.17.3
# 选填,履行protoc指令的作业目录,默许是装备文件地点目录
# 支撑路径中混用环境变量,比方$GOPATH
protocWorkDir: ""
# 选填,假如需求运用 googleapis,你应该在这里填写googleapis的commit id
# 能够填 latest,会主动转换成最新的版别
googleapis: 75e9812478607db997376ccea247dd6928f70f45
# 必填,代表scope匹配的目录中的proto文件,在编译时需求用到哪些插件
plugins:
# 插件的姓名、路径以及版别号。
# 插件的地址必须是 path@version 的格局,version能够填latest,会主动转换成最新的版别。
protoc-gen-deepcopy: istio.io/tools/cmd/protoc-gen-deepcopy@latest
protoc-gen-go: google.golang.org/protobuf/cmd/protoc-gen-go@latest
protoc-gen-go-json: github.com/mitchellh/protoc-gen-go-json@v1.0.0
protoc-gen-grpc-gateway: github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@v2.5.0
# 必填,界说了编译proto文件时 protoc 的参数
options:
- --go_out=paths=source_relative:.
- --go-json_out=.
- --deepcopy_out=source_relative:.
- --grpc-gateway_out=.
- --go-grpc_out=paths=source_relative:.
# 必填,界说了构建时 protoc 的引证路径,会被转换为 --proto_path (-I) 参数。
importPaths:
# 特别变量。代表当时装备文件地点文件夹
- .
# 环境变量。能够运用环境变量
# 也支撑 $GOPATH/include 这样的混合写法
- $GOPATH
- $POWERPROTO_INCLUDE
# 特别变量。引证待编译的proto文件地点的目录
# 比方将要编译 /a/b/data.proto,那么 /a/b 目录将会被主动引证
- $SOURCE_RELATIVE
# 特别变量。引证googleapis字段所指定的版别的google apis
- $POWERPROTO_GOOGLEAPIS
# 选填,构建完结之后履行的操作,作业目录是装备文件地点目录
# postActions是跨渠道兼容的
# 留意,必须在 powerproto build 时附加 -p 参数,才会履行装备文件中的postActions
postActions: []
# 选填,构建完结之后履行的shell脚本,作业目录是装备文件地点目录
# postShell不是跨渠道兼容的。
# 留意,必须在 powerproto build 时附加 -p 参数,才会履行装备文件中的postShell
postShell: |
// do something

多装备组合

一个装备文件中支撑填写多份装备,多份装备之间以 “—” 进行分割。

在下面的示例中,apis1目录运用的是v1.25.0的protoc-gen-go,而apis2目录运用的则是v1.27.0的protoc-gen-go。

scopes:
- ./apis1
protoc: v3.17.3
protocWorkDir: ""
googleapis: 75e9812478607db997376ccea247dd6928f70f45
plugins:
protoc-gen-go: google.golang.org/protobuf/cmd/protoc-gen-go@v1.25.0
protoc-gen-go-grpc: google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0
options:
- --go_out=.
- --go_opt=paths=source_relative
- --go-grpc_out=.
- --go-grpc_opt=paths=source_relative
importPaths:
- .
- $GOPATH
- $POWERPROTO_INCLUDE
postActions: []
postShell: ""
---
scopes:
- ./apis2
protoc: v3.17.3
protocWorkDir: ""
googleapis: 75e9812478607db997376ccea247dd6928f70f45
plugins:
protoc-gen-go: google.golang.org/protobuf/cmd/protoc-gen-go@v1.27.0
protoc-gen-go-grpc: google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.1.0
options:
- --go_out=.
- --go_opt=paths=source_relative
- --go-grpc_out=.
- --go-grpc_opt=paths=source_relative
importPaths:
- .
- $GOPATH
- $POWERPROTO_INCLUDE
postActions: []
postShell: ""

PostAction

PostAction答应在一切的proto文件都编译完结之后,履行特定的操作。与PostShell相比,它是跨渠道支撑的。

为了安全起见,只有在履行 powerproto build时附加上 -p 参数,才会履行装备文件中界说的PostActionPostShell

现在,PostAction支撑下面这些指令:

指令 描绘 函数原型
copy 仿制文件或文件夹 copy(src string, dest string) error
move 移动文件或文件夹 move(src string, dest string) error
remove 删除文件或文件夹 remove(path …string) error
replace 批量替换文件中的字符串 replace(pattern string, from string, to string) error

1. copy

用于仿制文件或文件夹,其函数原型为:

copy(src string, dest string) error

为了安全以及装备的兼容性,参数中只答应填写相对路径。

假如方针文件夹现已存在,将会兼并。

下面的比如将会把装备文件地点目录下的a仿制到b:

postActions:
- name: copy
args:
- ./a
- ./b

2. move

用于移动文件或文件夹,其函数原型为:

move(src string, dest string) error

为了安全以及装备的兼容性,参数中只答应填写相对路径。

假如方针文件夹现已存在,将会兼并。

下面的比如将会把装备文件地点目录下的a移动到b:

postActions:
- name: move
args:
- ./a
- ./b

3. remove

用于删除文件或文件夹,其函数原型为:

remove(path ...string) error

为了安全以及装备的兼容性,参数中只答应填写相对路径。

下面的比如将会删除装备文件地点目录下的a、b、c:

postActions:
- name: remove
args:
- ./a
- ./b
- ./c

4. replace

用于批量替换文件中的字符串,其函数原型为:

replace(pattern string, from string, to string) error

其间:

  • pattern是支撑通配符的相对路径。
  • from是要被替换的字符串。
  • to是替换为的字符串。

下面的比如将会把apis目录以及其子目录下的一切go文件中的 ,omitempty 替换为空字符串:

postActions:
- name: replace
args:
- ./apis/**/*.go
- ',omitempty'
- ""

发表评论

提供最优质的资源集合

立即查看 了解详情