go proto编译引用外部包问题解决方案示例
作者:返回主页Yisany
proto编译引用外部包问题
在test.proto
文件中引用了一个外部包:
import "google/api/annotations.proto";
当使用命令编译的时候提示找不到包
# protoc --go_out=plugins=grpc:. ./test.proto google/api/annotations.proto: File not found. test.proto:5:1: Import "google/api/annotations.proto" was not found or had errors.
解决
去github上将对应的包下载下来放在$GOPATH/src
下,例如这里缺失google/api
。
去gooogleapis将项目下载下来,并将整个项目放到$GOPATH/src
,此时的完整路径应该是:
$GOPATH/src/google/api/annotations.proto
这才完成了第一步,如果这时候你去直接执行protoc编译命令,依旧会得到上面的报错信息,protoc并没有成功的获取到外部proto文件。
为了解决问题,首先了解下protoc中import的两条规则:
- import 不允许使用相对路径;
- import 导入路径应该从根开始的绝对路径;
这个根开始的绝对路径指的是$GOPATH/src
开始的路径,这个需要先了解。
假设此时的目录结构为:
src -- google -- api -- annotations.proto -- test -- test.proto
test.proto
中引用了google/api/annotations.proto
,此时我们命令的执行位置为:
src/test
执行的命令为:
protoc --go_out=plugins=grpc:. ./test.proto
protoc有一个参数-I
,表示引入文件的目录路径,这里有坑。
-I
参数简单来说,就是如果多个proto文件之间有互相依赖,生成某个proto文件时,需要import其他几个proto文件,这时候就要用-I
来指定搜索目录。如果没有指定-I
参数,则在当前目录进行搜索。
例如这里的import "google/api/annotations.proto";
,这里的这个路径,其实是从$GOPATH/src
开始的路径。
也就是说,首先要用-I
参数将引入包的路径设置到$GOPATH/src
目录下,即
protoc -I ../
完整命令:
# pwd .../src/test # protoc -I ../ -I ./ --go_out=plugins=grpc:. ./test.proto
每个-I
参数都引入一个目录,proto文件中引入了几个外部proto文件理论来说就需要多少个-I
(同一目录的可以一次性引入),再加上待编译的proto也需要引入,所以上面这里就用了两个-I
来引入目录文件。
推荐使用$GOPATH/src
的方式来引入,简单直观不容易出错:
protoc -I ./ \ -I $GOPATH/src \ -I $GOPATH/src/google/api \ --go_out=plugins=grpc:. ./xxx.proto
以上就是go proto编译引用外部包问题解决方案示例的详细内容,更多关于go proto编译引用外部包的资料请关注脚本之家其它相关文章!