热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

protocgo插件编写之二(protocgengo命令行参数及关键路径)

protoc自动生成go文件最重要,也比较容易混淆的问题时,是生成路径的参数,本文简要介绍编写protocgo插件的参数形式,以及影响go文件生成的路径命令行参数通常protoc-


protoc 自动生成go文件最重要,也比较容易混淆的问题时,是生成路径的参数,本文简要介绍编写protoc go插件的参数形式,以及影响go文件生成的路径


命令行参数


通常protoc-gen-go生成器不需要命令行参数。但是,在某些复杂的情况下,它们是完成任务的唯一方法,尤其是在设置要在生成的代码中使用的导入路径时。



  • 传递参数


通过将参数值放在--go_out后,传递给go生成器。参数是由多个键值对(key=value)使用“,”连接起来的字符串, 如"a=111,b=222,c=333"。


下面的例子中, 参数 a=111,b=222以及import_prefix=xxx/传给 test 生成器,protoc-gen-test 是自定义的测试代码,会打印接收到的参数值。






参数传递给test生成器



protoc --test_out=a=111,b=222,import_prefix=xxx/:./db/ --plugin=protoc-gen-test=./protoc-gen-test feed.proto
2021/03/05 11:13:58 protoc-gen-test: info: map[string]string{"a":"111", "b":"222", "import_prefix":"xxx/"}

proto-gen-go的路径参数


影响 proto-gen-go 中的路径参数由如下几个:





    1. import_prefix=xxx/: 它为所有生成的import路径添加前缀




    1. go_package : proto file 文件中的option选项, 控制生成文件的包路径




    1. import_path=foo/bar:如果文件没有声明go_package,则用作包名。如果它包含斜杠,那么最右边的斜杠将被忽略。




    1. Mfoo/bar.proto=quux/shme: M参数,指定.proto文件编译后的包名(foo/bar.proto编译后为包名为quux/shme)




    1. paths



其中import_prefix 和 M 参数的区别是:import_prefix 是整体, M 参数是每个包单独修改


import_prefix


包公共前缀, 会在生成的import导入源前统一添加引用路径前缀


为使用import_prefix 生成的文件


package com_ktkt_srv_feed
// Code generated by protoc-gen-test. DO NOT EDIT.
// source: feed.proto
package com_ktkt_srv_feed
import (
proto "github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal

使用 import_prefix=xxx/生成的文件, 会在import的路径前自动添加 xxx/前缀


// Code generated by protoc-gen-test. DO NOT EDIT.
// source: feed.proto
package com_ktkt_srv_feed
import (
proto "xxx/github.com/golang/protobuf/proto"
)
// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal

go_package options


protocol buffer language 的 package 概念和go语言中的概念不太吻合。因此增加了一个go_package 的选项,定义了go包文件的导入路径,路径的最后一个部分,将成为go package的名称。


package com.ktkt.srv.feed;
option go_package = "github.com/test/aaa/bbb/testpb";

执行生成命令


protoc --test_out=./db/ --plugin=protoc-gen-test=./protoc-gen-test feed.proto

生成的文件路径:






生成的目录层级



最终生成的文件, go包名为testpb, 为go_package的最终一级路径


// Code generated by protoc-gen-test. DO NOT EDIT.
// source: feed.proto
package testpb
import (
proto "github.com/golang/protobuf/proto"
)
var _ = proto.Marshal

import_path


如果没有go_package 选项, import_path 确定包名称。如果import_path 包含斜线, 则最右侧斜线之前的内容都会被忽略掉, 最右侧斜线后面的内容作为包名


M=


M的作用是修改单个包的生成和引用路径
例如: Mfoo/bar.proto=quux/shme 声明 foo/bar.proto生成的包为 quux/shme。 这也取决于 import_prefix 参数.
使用:
1. 在定义proto文件时, 添加import,引入外部proto文件
2. 生成时指定M选项

syntax = "proto3";
package stock;
import "google/api/annotations.proto";

protoc -I=$GOPATH/src --gogo_out=plugins=Mgoogle/api/annotations.proto=github.com/gogo/googleapis/google/api:. input/*.proto

paths


用于指定生成文件的路径的结构,有两个值
- paths=import 相对于导入路径, 默认值
- paths=source_relative 相对于输入文件,即proto文件的路径

参考文献:



  • https://chromium.googlesource.com/external/github.com/golang/protobuf/+/v1.1.0/README.md

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

  • https://developers.google.com/protocol-buffers/docs/reference/go-generated



有疑问加站长微信联系(非本文作者)






推荐阅读
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • golang基础-protobuf使用,Go语言社区,Golang程序员人脉社 ... [详细]
  • https:github.comprotocolbuffersprotobufreleases报错:Pleasespecifyeither:•ago_packag ... [详细]
  • Google ProtoBuf的使用
    Google的protobuf太好用了,又小,读写又快跑步快慢受鞋的影响太大了,但是造鞋的工具研究起来还是很有难度的,百度 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • IDApro反编译exe时生成的C文件中#include的defs.h文件在IDA目录下plugins文件夹内*Thisfilecontainsdefinition ... [详细]
  • 我在开发的时候,总是会及时对自己的程序进行测试,总是频繁的重启webserver,容器不烦我们都觉得烦了。dependencys目录下增加:<depe ... [详细]
  • protobuf在序列化和反序列化中的优势:1):序列化后体积相比Json和XML很小,适合网络传输2):支持跨平台多语言3):消息格式升级和兼容性还不错4):序列化反序列化速度很 ... [详细]
  • protobuf 安装_protobuf详解
    protobuf详解一、什么是protobufprotobuf全称GoogleProtocolBuffers,是google开发的的一套用于数据存储,网络通信时用于协议编解码的工具 ... [详细]
  • gRPC框架学习:2、ProtocolBuffers学习文章目录gRPC框架学习:2、ProtocolBuffers学习1.前言2.定义消息类型(1). ... [详细]
  • 在.proto文件中使用导入时,出现“找不到文件”错误。 我正在使用Rider,但在使用VisualS ... [详细]
  • 体量|更多_初识protobuf ... [详细]
  • etcd、grpc、protobuf兼容性问题
    etcd、grpc、protobuf兼容性问题文章目录etcd、grpc、protobuf兼容性问题1.错误12.错误23.错误34.错误45.错误5近来在学习etcd,拿到一份代 ... [详细]
author-avatar
我无眼泪1221
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有