protoc支持c_protoc 命令参数

本文介绍了protoc命令的获取、基本用法及参数选项,包括如何使用protoc生成C++、Java、Go等不同语言的源代码。通过示例展示了如何指定输出目录、导入路径以及使用插件等,帮助理解protoc在处理.proto文件时的角色。
摘要由CSDN通过智能技术生成

protoc 命令的获得

84a8eb9e8e827ae060ff2fc6a4adda35.png

下载后的解压缩包含的内容如下(以mac下为例)

71247539195f557d2e3344091b7584fa.png

我们通过 which 命令可以查到 protoc 的安装目录, 覆盖它即可。

$ which protoc

/usr/local/bin/protoc

This package contains a precompiled Win32 binary version of the protocol buffer

compiler (protoc).  This binary is intended for Windows users who want to

use Protocol Buffers in Java or Python but do not want to compile protoc

themselves.  To install, simply place this binary somewhere in your PATH.

This binary was built using MinGW, but the output is the same regardless of

the C++ compiler used.

You will still need to download the source code package in order to obtain the

Java or Python runtime libraries.  Get it from:

https://github.com/google/protobuf/releases/

命令参数

$ protoc -help

Usage: protoc [OPTION] PROTO_FILES

Parse PROTO_FILES and generate output based on the options given:

-IPATH, --proto_path=PATH   Specify the directory in which to search for

imports.  May be specified multiple times;

directories will be searched in order.  If not

given, the current working directory is used.

--version                   Show version info and exit.

-h, --help                  Show this text and exit.

--encode=MESSAGE_TYPE       Read a text-format message of the given type

from standard input and write it in binary

to standard output.  The message type must

be defined in PROTO_FILES or their imports.

--decode=MESSAGE_TYPE       Read a binary message of the given type from

standard input and write it in text format

to standard output.  The message type must

be defined in PROTO_FILES or their imports.

--decode_raw                Read an arbitrary protocol message from

standard input and write the raw tag/value

pairs in text format to standard output.  No

PROTO_FILES should be given when using this

flag.

-oFILE,                     Writes a FileDescriptorSet (a protocol buffer,

--descriptor_set_out=FILE defined in descriptor.proto) containing all of

the input files to FILE.

--include_imports           When using --descriptor_set_out, also include

all dependencies of the input files in the

set, so that the set is self-contained.

--include_source_info       When using --descriptor_set_out, do not strip

SourceCodeInfo from the FileDescriptorProto.

This results in vastly larger descriptors that

include information about the original

location of each decl in the source file as

well as surrounding comments.

--dependency_out=FILE       Write a dependency output file in the format

expected by make. This writes the transitive

set of input file paths to FILE

--error_format=FORMAT       Set the format in which to print errors.

FORMAT may be 'gcc' (the default) or 'msvs'

(Microsoft Visual Studio format).

--print_free_field_numbers  Print the free field numbers of the messages

defined in the given proto files. Groups share

the same field number space with the parent

message. Extension ranges are counted as

occupied fields numbers.

--plugin=EXECUTABLE         Specifies a plugin executable to use.

Normally, protoc searches the PATH for

plugins, but you may specify additional

executables not in the path using this flag.

Additionally, EXECUTABLE may be of the form

NAME=PATH, in which case the given plugin name

is mapped to the given executable even if

the executable's own name differs.

--cpp_out=OUT_DIR           Generate C++ header and source.

--csharp_out=OUT_DIR        Generate C# source file.

--java_out=OUT_DIR          Generate Java source file.

--javanano_out=OUT_DIR      Generate Java Nano source file.

--js_out=OUT_DIR            Generate JavaScript source.

--objc_out=OUT_DIR          Generate Objective C header and source.

--python_out=OUT_DIR        Generate Python source file.

--ruby_out=OUT_DIR          Generate Ruby source file.

例子

Java 文件生成

$ protoc --java_out=./java/ ./proto/helloworld.proto

protoc 的命令格式为 protoc [OPTION] PROTO_FILES   (最后是待编译的 proto文件)

--java_out 为输出java代码的目录,这里指定的是 ./java/ 目录。

随后我们指定了proto文件的位置 ./proto/helloworld.proto 。

执行上述命令,我们就 ./java/ 目录下就产生了对应的 java文件。

go 文件生成

下面这几种方式生成都可以:

$ protoc --go_out=./go/ ./proto/helloworld.proto

跟上面Java的生成完全一样,只不过这次是让生成 go 的代码。

$ protoc --go_out=./go/ -I proto ./proto/helloworld.proto

这次多了一个参数 -I , -I=IMPORT_PATH  can be used as a short form of --proto_path.

-IPATH, --proto_path=PATH   Specify the directory in which to search for imports.  May be specified multiple times; directories will be searched in order.  If not given, the current working directory is used.

IMPORT_PATH specifies a directory in which to look for .proto files when resolving import directives. If omitted, the current directory is used. Multiple import directories can be specified by passing the --proto_path option multiple times; they will be searched in order.

简单来说,就是如果多个proto文件之间有互相依赖,生成某个proto文件时,需要import其他几个proto文件,这时候就要用-I来指定搜索目录。

如果没有指定 –I 参数,则在当前目录进行搜索。

上面两种方法产生的目录如下图, –I 参数起作用了后,生成目录少了一级:

53780b13a76e1b81922a51d61bf96788.png

javanano 文件生成

$ protoc --javanano_out=ignore_services=true:./javanano/ -I proto ./proto/garlic.proto

由于 javanano 是给 android 用的,没有服务器端代码,所以多了--javanano_out=ignore_services=true:DST_DIR 这个设置,其他完全一样。

更复杂的可以参考:

为了更方便的使用gRPC,包括protoc的命令,针对不同语言有下面额外的方法: Language Platform Command

Node.js Linux, Mac, Windows npm install grpc

Python Linux, Mac, Windows pip install grpcio

Ruby Linux, Mac, Windows gem install grpc

PHP Linux, Mac, Windows pecl install grpc-beta

Go Linux, Mac, Windows go get google.golang.org/grpc

Objective-C Mac Runtime source fetched automatically from Github by Cocoapods

C# Windows Install gRPC NuGet package from your IDE (Visual Studio, Monodevelop, Xamarin Studio)

Java Linux, Mac, Windows

C++ Linux, Mac, Windows

参考资料:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值