【问题标题】:protoc generated grpc files and gateway files end up in different paths?protoc 生成的 grpc 文件和网关文件最终在不同的路径中?
【发布时间】:2021-05-16 04:31:57
【问题描述】:

我对此有点困惑。文件结构:

/Project
generate.sh
  gateway/
      cmd/
          main.go
      pkg/
          gatewaypb/
      proto/ 
         service.proto

我的generate.sh 显示如下:


set -e

module="github.com/my-org/grpc-project"
// Find all dirs with .proto files in them
for proto in */proto; do

    dir=$(echo "$proto"|cut -d"/" -f1)
    echo "regenerating generated protobuf code for ${proto}"
    protoc --proto_path .\
           --go-grpc_out=. --go-grpc_opt=module=${module}\
           --go_out=. --go_opt=module=${module}\
           "${proto}"/*.proto
    echo "creating reverse proxy protobuf code for ${proto}"

    protoc -I . --grpc-gateway_out=.\
     --grpc-gateway_opt logtostderr=true \
     --grpc-gateway_opt paths=source_relative \
     "${proto}"/*.proto
done

正确地说,第一个protoc 符合预期,而第二个则没有。当它们应该在相同的路径中时,它们会以不同的路径输出文件。

运行generate.sh 后,我剩下:

/Project
generate.sh
  Service/
      cmd/
          main.go
      pkg/
          gatewaypb/
              *gateway.pb.go
              *gateway._grpc.pb.go
      proto/ 
         *gateway.pb.gw.go
         service.proto

为什么生成的网关文件最终会出现在proto/ 目录中?

我需要为grpc-gateway-out 提供什么值才能使其在/pkg/gatewaypb 中作为其他生成的grpc 文件结束?

我的service.proto 文件:

syntax = "proto3";
package gateway.api.v1;
option go_package = "github.com/my-org/grpc-project/gateway/pkg/gatewaypb";

import "google/api/annotations.proto";

message StringMessage {
  string value = 1;
}

service YourService {
      rpc Echo(StringMessage) returns (StringMessage) {
          option (google.api.http) = {
              post: "/v1/example/echo"
              body: "*"
            };
      }
}

【问题讨论】:

  • 试试--grpc-gateway_opt module=${module}(替换--grpc-gateway_opt paths=source_relative)。这样做应该意味着使用与其他插件相同的逻辑(this issue 中的更多信息)。
  • 成功了,非常感谢!欢迎您提出合理的答案,我会确保接受它!

标签: go protocol-buffers grpc protoc


【解决方案1】:

根据 cmets,您在生成 protobuf 和 gRPC 文件时使用了模块选项 (--go_opt=module=${module} & --go-grpc_opt=module=${module})。您在生成网关文件 (--grpc-gateway_opt paths=source_relative) 时使用的选项使用不同的算法来确定文件的存储位置;解决方法是使用模块选项 - --grpc-gateway_opt module=${module}

以下是the docs 对这三个选项的看法(这些特定选项用于 protobuf 生成;其他生成器具有相同的功能,但将 go_ 替换为 go-grpc_/grpc-gateway_):

  • 默认情况下,输出文件放置在以 Go 包的导入路径命名的目录中。例如,带有上述 go_package 选项的文件 protos/foo.proto 会生成名为 example.com/foo/bar/foo.pb.go 的文件。
  • 如果为 protoc 指定了 --go_opt=module=$PREFIX 标志,则会从输出文件名中删除指定的目录前缀。例如,带有 go_package 选项“example.com/foo/bar”和标志 --go_opt=module=example.com/foo 的文件 protos/foo.proto 会生成名为 bar/foo.pb.go 的文件。
  • 如果为 protoc 指定了 --go_opt=paths=source_relative 标志,则输出文件与输入文件位于相同的相对目录中。例如,文件 protos/foo.proto 会生成一个名为 protos/foo.pb.go 的文件。

【讨论】:

    猜你喜欢
    • 2022-10-15
    • 1970-01-01
    • 2022-08-02
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-25
    • 2013-12-30
    相关资源
    最近更新 更多