zoukankan      html  css  js  c++  java
  • 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的两条规则:

    1. import 不允许使用相对路径;
    2. 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
    
  • 相关阅读:
    monkeyrunner之夜神模拟器的安装与使用(二)
    monkeyrunner之安卓开发环境搭建(一)
    MySQL 返回未包含在group by中的列
    MySQL数据库初体验
    MongoDB安装
    关于数据库你必须知道的事~
    PostgreSQL中的MVCC 事务隔离
    深入浅出MySQL之索引为什么要下推?
    Java集合篇:Map集合的几种遍历方式及性能测试
    Oracle11g:数据库恢复总结
  • 原文地址:https://www.cnblogs.com/yisany/p/14875488.html
Copyright © 2011-2022 走看看