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

时间:2019-08-30 20:14:08

标签: go protocol-buffers grpc

我正在尝试使用一个非常基本的单一操作创建一个grpc服务,该操作为GetDeployment,将名称空间和名称作为输入,并返回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) {}
}

提前谢谢

1 个答案:

答案 0 :(得分: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。