zoukankan      html  css  js  c++  java
  • protoc 命令参数

    protoc 命令的获得

    源码在 https://github.com/google/protobuf , 如果不想自己编译获得最新版本,则可以下载官方编译好的各个平台的,下载地址:https://github.com/google/protobuf/releases ,注意不是带语言后缀的文件,那是源码,如下图:

    image

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

    image

    我们通过 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 参数起作用了后,生成目录少了一级:

    image

    javanano 文件生成

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

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

    参考: https://github.com/grpc/grpc-common/issues/156

     

    更复杂的可以参考:

    Android protobuf nano documentation
    http://stackoverflow.com/questions/22247951/android-protobuf-nano-documentation

    https://developers.google.com/protocol-buffers/docs/proto3#generating

     

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

    http://www.grpc.io/posts/installation

    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    Use our Maven and Gradle plugins that provide gRPC with statically linked boringssl
    C++ Linux, Mac, Windows    Currently requires manual build and install

     

     

     

    参考资料:

    https://github.com/google/protobuf/tree/master/javanano

    https://github.com/google/protobuf

  • 相关阅读:
    java8新特性→方法和构造函数引用:替代Lambda表达式
    java8新特性→Stream流:用于解决已有集合类库既有的弊端
    java8新特性→函数式接口
    java8新特新→Lambda表达式
    子查询
    Vue之监听数据变化watch、computed、methods
    Vue路由-使用命名视图实现经典布局
    Vue路由-使用children属性实现路由
    Vue之路由传参
    Vue路由之touter-link、router-direct的使用
  • 原文地址:https://www.cnblogs.com/ghj1976/p/5435565.html
Copyright © 2011-2022 走看看