【问题标题】:Import type definitions from other packages in protobuf从 protobuf 中的其他包导入类型定义
【发布时间】:2020-01-04 01:31:09
【问题描述】:

我正在尝试使用一个非常基本的单个操作(GetDeployment)创建一个 grpc 服务,将命名空间和名称作为输入,并返回一个 Kubernetes 部署。问题是我不想为部署定义我自己的message,因为它已经存在于official Kubernetes repository 上。

我对 grpc 还很陌生,可能不太了解它是如何工作的,但是我可以将这条消息导入到我自己的文件中,然后我可以编写以下 .proto 文件吗?

syntax = "proto3";
package api;

import "google/api/annotations.proto";
import "k8s.io/kubernetes/pkg/api/v1/generated.proto";

message GetDeploymentOptions {
  string namespace = 1;
  string name = 2;
}

service AppsV1 {
  rpc GetDeployment(GetDeploymentOptions) returns (k8s.io.kubernetes.pkg.api.v1.Deployment) {}
}

提前谢谢你

【问题讨论】:

    标签: go protocol-buffers grpc


    【解决方案1】:

    GRPC codegen 只是一个 protoc 插件。它为servicerpc 生成代码,但它遵循normal protobuf rules 的导入。

    在您的示例中,如果您的文件位于 src/api.proto 中,并且 k8s api 存储库是签入 thirdparty/k8s.io/api 文件夹的 git 子模块,您将通过运行生成您需要的文件:

    root>protoc.exe -I thirdparty k8s.io/api/core/v1/generated.proto --go_out=go
    root>protoc.exe -I thirdparty src/api.proto --go_out=plugins=grpc:go
    

    第一个命令生成包含 k8s 消息的 .pb.go 文件,而第二个命令生成包含消息和服务的 .pb.go 文件。

    查看该文件的临时导入,您可能还需要将 api-machinery 检入 k8s.io/apimachinery 并在该文件上运行 protoc。

    【讨论】:

    • 非常感谢,你让我很开心。你的解释很清楚。我最终实际上检查了 api-machinery,一切都像魅力一样。
    猜你喜欢
    • 2021-03-17
    • 1970-01-01
    • 2020-08-05
    • 2018-04-05
    • 2016-12-03
    • 2010-10-17
    • 2016-09-19
    • 2016-01-15
    • 2017-10-05
    相关资源
    最近更新 更多