go proto编译引用外部包问题解决方案示例

 更新时间:2023年10月13日 11:18:25   作者:返回主页Yisany  
这篇文章主要为大家介绍了go proto编译引用外部包问题解决方案示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

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编译引用外部包的资料请关注脚本之家其它相关文章!

相关文章

  • Golang Mongodb模糊查询的使用示例

    Golang Mongodb模糊查询的使用示例

    这篇文章主要给大家介绍了关于Golang Mongodb模糊查询的使用示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-02-02
  • golang版本切换的实现

    golang版本切换的实现

    本文主要介绍了golang版本切换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2026-05-05
  • Go编译原理之函数内联

    Go编译原理之函数内联

    这篇文章主要为大家介绍了Go编译原理之函数内联示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • Go语言Seeker接口与文件断点续传实战教程

    Go语言Seeker接口与文件断点续传实战教程

    Go语言的io包中Seeker接口为大文件处理或需要随机访问的场景提供了强大的支持,本文通过具体案例详细介绍了Seeker接口的应用,包括随机访问大文件、断点续传等场景,以及如何使用Seeker接口进行有效的文件读写操作
    2024-10-10
  • golang进行简单权限认证的实现

    golang进行简单权限认证的实现

    本文主要介绍了golang简单权限认证的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • go语言实现sftp包上传文件和文件夹到远程服务器操作

    go语言实现sftp包上传文件和文件夹到远程服务器操作

    这篇文章主要介绍了go语言实现sftp包上传文件和文件夹到远程服务器操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • GoLang中sql.Exec()报错解决办法

    GoLang中sql.Exec()报错解决办法

    这篇文章主要给大家介绍了关于GoLang中sql.Exec()报错的解决办法,文中通过代码介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • Golang并发操作中常见的读写锁详析

    Golang并发操作中常见的读写锁详析

    Golang中的锁机制主要包含互斥锁和读写锁互斥锁互斥锁是传统并发程序对共享资源进行控制访问的主要手段,这篇文章主要给大家介绍了关于Golang并发操作中常见的读写锁的相关资料,需要的朋友可以参考下
    2021-08-08
  • Go语言中append函数用法分析

    Go语言中append函数用法分析

    这篇文章主要介绍了Go语言中append函数用法,对比使用append函数与不使用append函数的两个实例,详细分析了Go语言中append函数的功能,需要的朋友可以参考下
    2015-02-02
  • Golang 中的 条件变量(sync.Cond)详解

    Golang 中的 条件变量(sync.Cond)详解

    这篇文章主要介绍了Golang 中的 条件变量(sync.Cond)详解的相关资料,需要的朋友可以参考下
    2022-12-12

最新评论