赞
踩
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
安装好的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的版本信息
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的版本
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文件的路径
--proto_path
选项多次--proto_path
选项指定的import路径(IMPORT_PATH),必须包含待编译的.proto文件。官方解释为:
尽管待编译的.proto文件是相对于当前目录命名的,但其必须位于某个IMPORT_PATH 中,以便编译器可以确定其规范名称。
编译后生成的特定语言的代码的输出目录,可以指定一个或多个。
--java_out
:指明编译后生成的Java代码的输出目录--language_out
选项。因为,它不仅指定了输出目录,还表明生成的是指定语言的文件--java_out
选项,最终报错如下:path_to_proto_fileo
:待编译的.proto文件,可以指定多个.proto文件
path_to_proto_file
合成的应该是.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
.proto文件可以直接从官方文档copy:Defining Your Protocol Format ,命名为address_book.proto
使用proto2进行编译,编译命令如下(没有显式指定-I
选项)
protoc2 --java_out=./ address_book.proto # 由于本机同时安装proto2和proto3,这里使用proto2
最终,在当前目录,生成了很对对应的Java文件
下面的.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文件,将会报错
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。