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
- IMPORT_PATH和
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. 其他
- windows上的安装,参考博客:windows下安装和配置protobuf流程
- 原本也想在windows上安装proto2,发现proto2好像只有win32,因此最后安装了proto3