中文 | English
项目地址:🎉 An awesome version control tool for protoc and its related plugins. (github.com)
PowerProto首要用于处理下面三个问题:
- 下降gRPC的运用门槛与运用本钱。
- 处理protoc以及其相关插件(比方protoc-gen-go、protoc-gen-grpc-gateway)的版别操控问题。
- 高效办理proto的编译,完结多渠道兼容、一键装置与编译。
🎉 功能
- 完结protoc的一键装置与多版别办理。
- 完结protoc相关插件(比方protoc-gen-go)的一键装置与多版别办理。
- 经过装备文件办理proto的编译,而非shell脚本,提高可读性与兼容性。
- 引导式生成装备文件,跨渠道兼容,一份装备在多个渠道均能够完结一键编译。
- 支撑批量、递归编译proto文件,提高效率。
- 跨渠道支撑PostAction,能够在编译完结之后履行一些惯例操作(比方替换掉一切生成文件中的”omitempty”)。
- 支撑PostShell,在编译完结之后履行特定的shell脚本。
- 支撑 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]
收拾装备首要包含两个操作:
- 经过查询,将版别中的latest替换为真实的最新版别号。
- 装置装备文件中界说的一切依靠。
支撑经过 -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
参数,才会履行装备文件中界说的PostAction
与PostShell
。
现在,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'
- ""