protoc Go Package 命令本地覆盖?

按照官方 gRPC 网站上的快速入门 gRPC Go 指南,它有一个步骤,要求用户使用此命令重新编译更新的 .proto 文件:

$ protoc --go_out=. --go_opt=paths=source_relative --go-grpc_out=. --go-grpc_opt=paths=source_relative helloworld/helloworld.proto

我对“人类编写”的Go代码如何使用新编译的protobuf文件感到有些困惑。

在示例“人类编写”Go代码中,他们使用以下导入来引用原型buf代码:

pb "google.golang.org/grpc/examples/helloworld/helloworld"

protoc不会更新此程序包,而是更新运行命令的同一目录中的程序包。该命令如何确保“人类编写”的 Go 代码使用新编译的 protobuf 代码?helloworld/helloworld.protoprotoc


冉冉说
浏览 146回答 1
1回答

神不在的星期二

我发现这是Protobufs(和gRPC)中更令人困惑的方面之一。我认为正在解决的问题是Protobufs需要:允许名称间距以限定服务范围|消息的范围,例如 DNS 域支持无数的编程语言(以不同的方式实现命名空间)。protoc具有允许(重新)映射的选项,例如,使用protobuf选项将protobuf的包映射到特定于语言的命名空间,例如)。请参阅 Golang 的 Go 生成代码。v1/apigo_package使用Go Modules时,这稍微复杂一些,但总而言之,您遇到的可能是上述某些(意外的)组合,其中示例代码假定一个模块名称,并且基于另一个模块名称的假设进行构建。protocTL;DR 更新代码的模块引用以反映正确生成的路径。如果生成代码位于错误的位置,则只需将其移动到正确的子目录(路径),但最好更新命令以将文件生成到正确的目录。pbprotoc例something.proto:syntax = "proto3";package v1alpha1;option go_package = "github.com/me/my-protos;v1alpha1";NOTE 将原型包别名为我想要引用的内容,如 Golang 中所示。go_packagev1alpha1github.com/me/my-protos然后我生成:MODULE="github.com/me/my-protos"protoc \--proto_path=. \--go_out=./api/v1alpha1 \--go_opt=module=${MODULE} \--go-grpc_out=./api/v1alpha1 \--go-grpc_opt=module=${MODULE} \./something.proto注意此示例也生成 gRPC 代码。它避免了(! 为生成的代码创建路径,因为我正在该存储库中生成源代码。我只想要创建文件的相对路径。protocgithub.com/me/my-protos./api/v1alpha这会产生:my-protos├── something.proto├── api│   └── v1alpha1│       ├── something_grpc.pb.go│       └── something.pb.go├── go.mod├── go.sum└── README.md我可以导入:import (    pb "github.com/me/my-protos/api/v1alpha1")注意从其他存储库中,我现在可以访问我的 protos 存储库,将重现和生成的位置结合起来,以提供所需的路径。github.com/me/my-project/api/v1alpha1
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go