当前位置: 首页 > 知识库问答 >
问题:

协议go_package的正确格式?

张光辉
2023-03-14

我在Go有一个现有项目,我正在使用协议缓冲区/gRPC。直到最近,go\u package选项还是可选的,并且生成的go package名称将与proto package名称相同。

此文件位于项目根目录中。生成的代码文件(authenticator.pb.go)位于同一位置。原型文件:

syntax = "proto3";

package authenticator;

service Authenticator {...}

Generation命令指定我要在同一目录中输出:

protoc --go_out=plugins=grpc:. authenticator.proto

今天,我推出了新版本的协议缓冲区编译器和github。com/golang/protobuf/protoc gen go。第一次跑步时,a收到警告:

WARNING: Missing 'go_package' option in "authenticator.proto",
please specify it with the full Go package path as
a future release of protoc-gen-go will require this be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.

建议的链接或多或少是无用的。但本教程更为明确:

go_package选项定义包的导入路径,该路径将包含为此文件生成的所有代码。Go包名将是导入路径的最后一个路径组件。例如,我们的示例将使用包名“tuorialpb”。

option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";

将此选项添加到proto文件并重新运行命令后,相对于项目根目录,输出最终会出现在此路径中。类似于:

$GOPATH/src/github.com/<org>/authenticator/github.com/<org>/authenticator/authenticator.pb.go

我尝试了以下替代方法作为go\u包的名称:

  • <代码>
  • 验证器

生成发生在正确的位置,但我得到了警告:

WARNING: Deprecated use of 'go_package' option without a full import path...

那么,在不破坏项目布局的情况下,正确的方法是什么呢?

共有3个答案

殷承恩
2023-03-14

当我添加时,上述错误消失了

选项go\u package=“github.com/monkrus/grpc-from0;grpc\u from0” 如下所示:

刘成礼
2023-03-14

您只需要添加一个Go选项,它将告诉您添加相对于proto文件的文件。

protoc --go_out=. --go_opt=paths=source_relative your_file.proto 

这将生成your\u文件。pb。转到与您的\u文件相同的目录。原型

欧阳乐生
2023-03-14

对于纯原始世代,您可以执行以下操作

protoc --go_out=paths=source_relative:./gen -I. authenticator.proto

或为grpc生成以下内容

protoc --go_out=plugins=grpc:./gen --go_opt=paths=source_relative authenticator.proto

如果失败,您可能有一个更新版本的protoc,需要使用以下命令。

protoc --go-grpc_out=./gen --go-grpc_opt=paths=source_relative authenticator.proto

这只是谷歌再次就如何编写和管理代码做出孤立的决定。但是,如果你深入研究了有类似问题的人的足够多的问题,我发现现在可以使用上面的命令了。除了添加另一个答案中所示的完整导入路径

option go_package = "github.com/example/path/gen;gen";

按照上面的包和protoc命令,您将在项目根目录中拥有proto文件,模块名为github。com/示例/路径。然后,您的代码将被放置在负责创建的gen文件夹中。

您可能需要调整source\u relative的输出位置以供使用,但至少不会导致路径重复或不得不依赖于将代码再次放置在GOPATH中。

由于此票证中发现的其他更改,这可能会中断。不幸的是,二进制名称完全相同,因此,如果遇到问题,请阅读该票据,并尝试切换已安装的版本,直到新的protoc gen go准备好进行生产。

 类似资料:
  • Alink协议格式 网络通道能力介绍 传输数据形式 透传 非透传(Alink格式) 服务调用方式 同步调用 异步调用 Alink基础格式介绍 参数解析 格式说明 通用Code以及错误码解析 业务Code解析 使用MQTT连接阿里云IoT 网关和子设备场景 子设备场景介绍 网关添加/删除/获取子设备的拓扑关系 添加子设备拓扑关系 删除拓扑关系 获取拓扑关系 网关向服务器报告子设备上线/下线信息 子设

  • 问题内容: 我正在使用python-spidermonkey,它在内部使用PyMapping_Check来识别用作全局对象(在rt.new_context(global)中)是否实现了映射协议。(这基本上是传递给python- spidermonkey的字典,因此javascript对python变量的访问受到限制。) 我无法在Python中找到映射协议的正式定义,因此我一直在尝试和尝试确定其中的

  • 问题内容: 使用默认实现的Swift 2协议扩展遇到了一个问题。基本要点是,我已经提供了协议方法的默认实现,我将在实现该协议的类中重写该方法。该协议扩展方法是从基类中调用的,然后该基类将调用在派生类中已重写的方法。结果是未调用重写的方法。 我试图将问题提炼到最小的游乐场,以说明以下问题。 问题答案: 不幸的是,协议还没有这样的动态行为。 但是,您可以(在类的帮助下)通过在中实现并在中进行覆盖来做到

  • Git 可以使用四种主要的协议来传输资料:本地协议(Local),HTTP 协议,SSH(Secure Shell)协议及 Git 协议。 在此,我们将会讨论那些协议及哪些情形应该使用(或避免使用)他们。 本地协议 最基本的就是 本地协议(Local protocol) ,其中的远程版本库就是硬盘内的另一个目录。 这常见于团队每一个成员都对一个共享的文件系统(例如一个挂载的 NFS)拥有访问权,或

  • 协议为方法、属性、以及其他特定的任务需求或功能定义蓝图。协议可被类、结构体、或枚举类型采纳以提供所需功能的具体实现。满足了协议中需求的任意类型都叫做遵循了该协议。 除了指定遵循类型必须实现的要求外,你可以扩展一个协议以实现其中的一些需求或实现一个符合类型的可以利用的附加功能。 协议的语法 定义协议的方式与类、结构体、枚举类型非常相似: protocol SomeProtocol { //

  • 本页包含内容: 协议的语法(Protocol Syntax) 对属性的规定(Property Requirements) 对方法的规定(Method Requirements) 对突变方法的规定(Mutating Method Requirements) 对构造器的规定(Initializer Requirements) 协议类型(Protocols as Types) 委托(代理)模式(Dele