Protobuf(一):mac上同时安装proto2和proto3并编译.proto文件

1. 安装proto2

  • mac上安装proto2,可以参考博客: 【工具使用】mac 安装 protobuf 2.5.0

  • 笔者安装的是2.6.1版本,对应的下载地址:v2.6.1/protobuf-2.6.1.zip

  • 笔者实验发现,proto3能编译proto2语法的.proto文件,反之则不行。

  • 报错信息如下:

     Unrecognized syntax identifier "proto3".  This parser only recognizes "proto2".
    
  • 因此,出于方便考虑,笔者尝试在mac上同时安装proto2和proto3

2. protoc更名为protoc2

  • 安装好的protoc命令,一般位于/usr/local/bin/目录下,也可以使用which protoc命令进行查看

  • Google提供的]的protoc代码,则位于/usr/local/include/google/protobuf/目录下,如duration.proto

  • 就跟同时安装python2和python3一样,将proto2对应的protoc命令改名为protoc2

    mv /usr/local/bin/protoc /usr/local/bin/protoc2
    
  • 此时,在终端输入protoc2 --version,则可以查看proto2的版本信息

3. 安装proto3

  • proto3有编译好的,针对不同操作系统的安装包,只需要下载、解压缩、拷贝安装文件即可

  • mac上安装proto3,可以参考博客:Mac OS 安装 protobuf 最简单教程

  • 笔者安装的是3.19.4版本,下载地址:protoc-3.19.4-osx-x86_64.zip

  • 验证通过后,将proto3的protoc命令重命名为protoc3

    mv /usr/local/bin/protoc /usr/local/bin/protoc3
    
  • 此时,可以通过protoc3 --version查看proto3的版本

4. 编译.proto文件

4.1 protoc命令介绍

  • protobuf语法撰写的文件后缀为.proto,可以通过安装的protoc命令将其编译为指定语言的源代码

  • protoc命令示例如下,具体可以参考官方文档:Generating Your Classes

    protoc --proto_path=IMPORT_PATH --cpp_out=DST_DIR --java_out=DST_DIR --python_out=DST_DIR path_to_proto_file
    
  • --proto_path:可以简写为-I,指明待编译的.proto文件import进来的其他.proto文件的路径

    • 如果省略该选项,则默认在当前目录查找
    • 如果存在多个IMPORT_PATH,可以使用--proto_path选项多次
    • 注意: --proto_path选项指定的import路径(IMPORT_PATH),必须包含待编译的.proto文件。官方解释为:

      尽管待编译的.proto文件是相对于当前目录命名的,但其必须位于某个IMPORT_PATH 中,以便编译器可以确定其规范名称。

    • 如果IMPORT_PATH 中没有待编译的.proto文件路径,编译时会报错
      在这里插入图片描述
  • 编译后生成的特定语言的代码的输出目录,可以指定一个或多个。

    • 例如,--java_out:指明编译后生成的Java代码的输出目录
    • 注意: 如果想在当前目录生成指定语言的文件,不能省略--language_out选项。因为,它不仅指定了输出目录,还表明生成的是指定语言的文件
    • 想在当前目录生成Java文件,但未指定--java_out选项,最终报错如下:
  • path_to_proto_fileo:待编译的.proto文件,可以指定多个.proto文件

    • IMPORT_PATH和path_to_proto_file合成的应该是.proto文件的确定地址
    • 例如,下面的编译命令中,.proto文件的绝对地址为/Users/sunrise/protobuf/src/main/proto/,就是由IMPORT_PATH和path/to/file.proto合成的
      protoc3 -I=/usr/local/include/ -I=/Users/sunrise/protobuf/src/main --java_out=./ proto/address_book.proto proto/bar.proto
      

4.2 编译实战

  • .proto文件可以直接从官方文档copy:Defining Your Protocol Format ,命名为address_book.proto

  • 使用proto2进行编译,编译命令如下(没有显式指定-I选项)

    protoc2 --java_out=./ address_book.proto # 由于本机同时安装proto2和proto3,这里使用proto2
    
  • 最终,在当前目录,生成了很对对应的Java文件

4.3 如何解决import所需的.proto文件

  • 下面的.proto文件,通过import definitions导入了Duration这一常用的数据类型

    syntax = "proto2";
    
    package tutorial;
    
    import "google/protobuf/duration.proto";
    
    option java_multiple_files = true;
    option java_package = "com.sunrise.protos";
    option java_outer_classname = "AddressBookProtos";
    
    message DurationTest {
      optional google.protobuf.Duration duration = 1;
    }
    
  • 跟待编译的.proto文件一样,通过import引入的.proto文件,要求IMPORT_PATH和import指定的.proto文件路径合在一起,必须能够确定一个.proto文件

  • 本机的/usr/local/include/google/protobuf/目录下,包含duration.proto文件,最终的编译命令为

    protoc3 -I=/usr/local/include/ -I=./ --java_out=./ address_book.proto bar.proto
    
  • 如果无法在指定路径找到对应的.proto文件,将会报错
    在这里插入图片描述

5. 其他

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值