从 protobuf 中的其他包导入类型定义

Import type definitions from other packages in protobuf

我正在尝试使用非常基本的单一操作创建 grpc 服务,即 GetDeployment,将命名空间和名称作为输入,returns Kubernetes 部署。问题是我不想为 Deployment 定义我自己的 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) {}
}

提前致谢

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

在您的示例中,如果您的文件位于 src/api.proto 中并且 k8s api 存储库是一个 git 子模块签出到 thirdparty/k8s.io/api 文件夹中,您将生成运行ning:

你需要的文件
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 和 运行 协议也在该文件上。