美文网首页
protobuf 导入另一文件夹下的proto

protobuf 导入另一文件夹下的proto

作者: yddeng | 来源:发表于2020-04-23 10:25 被阅读0次

    环境: protobuf2 ,golang

    项目test下 存放proto的目录结构

    ---test // 项目根
    ------ cs 
          --- cs.proto
    ------ ss
         --- ss.proto
    

    cs.proto

    syntax = "proto2";
    package cs;
    
    message Test{
        optional string name = 1;
    }
    

    ss.proto

    syntax = "proto2";
    package ss;
    import "test/cs/cs.proto";
    
    message Test{
        optional cs.Test cstest = 1;
    }
    

    ss.proto 文件引用 cs/cs.proto

    1. import 不允许使用相对路径Backslashes, consecutive slashes, ".", or ".." are not allowed in the virtual path
    2. import 导入路径应该从 根开始的绝对路径 test/cs/cs.proto

    protoc 命令
    protoc -I ../../ -I ./ --go_out=. *.proto // 此条命令在 ss 目录下运行,可根据自己习惯在不同地址运行,但是-I 参数需注意
    -I 表示引入文件的目录路径。这里有一个坑。
    比如这里的 import "test/cs/cs.proto"; 实际是从GOPATH 路径引用过来的,所以参数一应该 ../../ 到GOPATH。组合出来后就是 “../../test/cs/cs.proto" 。这样才能引用出来。
    注意:可能这么写

    protoc -I ../ -I ./ --go_out=. *.proto // 此条命令在 ss 目录下运行
    
    ss.proto
    import "cs/cs.proto";
    

    组合后 “../cs/cs.proto" 。看似相对路径组合后没毛病。protoc 编译也能通过。
    但是 生成的对应 cs.pb.go 文件,里的import 路径就是 "cs" 。这个go工程是编译不过的。go项目引用需要从gopath 路径过来。即 “test/cs “。

    总结:

    1. proto 文件的 import 需要从 gopath 路径过来(即项目名开始的绝对路径)。
    2. protoc -I 路径需要到 gopath。

    如果要使生成的 pb.go 文件存放目录 与 proto 目标不一致

    ---test // 项目根
    ------ cs 
          --- cs.proto
          --- message
              --- cs.pb.go
    ------ ss
         --- ss.proto
         --- message
            --- ss.pb.go
    

    cs.proto

    syntax = "proto2";
    package message;
    option go_package = "test/cs/message";
    
    message Test{
        optional string name = 1;
    }
    

    ss.proto

    syntax = "proto2";
    package message;
    option go_package = "test/ss/message";
    import "test/cs/cs.proto";
    
    message Test{
        optional cs.Test cstest = 1;
    }
    

    protoc 命令
    protoc -I ../../ -I ./ --go_out=paths=source_relative:message/ *.proto // 此条命令在 ss 目录下运行

    前面的-I 参数意义与上一样。
    因为实际编译成 pb.go 文件的引用是 与定义的 import "test/cs/cs.proto"; 有关系。如果没有 go_package ,那么编译后的引用默认是 “test/cs"。有 go_package 后,引用就为go_package 的路径。

    --go_out=paths=source_relative:message/ 相对路径,将编译后的文件输出到某个目录。

    相关文章

      网友评论

          本文标题:protobuf 导入另一文件夹下的proto

          本文链接:https://www.haomeiwen.com/subject/mucoihtx.html