Отдельный клиент и сервер, сгенерированные протоколом

# #go #encapsulation #protoc #grpc-go #generated-code

Вопрос:

Я пытаюсь создать серверный интерфейс, созданный по протоколу, и реализацию клиента в отдельных пакетах

Часть заголовка моих .proto файлов выглядит следующим образом:

 syntax = "proto3";

option go_package = "github.com/<username>/<myservice>/pkg/grpc";
 

И я использую эту команду для создания .go файлов:

 protoc --go_out=. --go_opt=paths=source_relative
        --go-grpc_out=. --go-grpc_opt=paths=source_relative
        pkg/grpc/*.proto
 

Он генерирует pkg/grpc/<name>.pb.go файлы, содержащие модели, и pkg/grpc/<name>_grpc.pb.go файлы, содержащие интерфейс сервера и реализацию клиента (рисунок)

введите описание изображения здесь

Но я хочу, чтобы сервер перешел , скажем internal/pkg/grpc/ , в то время как клиент и модели остаются внутри pkg/grpc/ , а сервер правильно импортирует модели.

Версии:

  • protoc версия является libprotoc 3.19.0
  • protoc-gen-go-grpc версия является protoc-gen-go-grpc 1.1.0
  • protoc-gen-go версия является protoc-gen-go v1.27.1

Я новичок в голанге и протобуфе, поэтому, если то, о чем я прошу, окажется плохой практикой, не стесняйтесь указывать мне на идиоматическую

Ответ №1:

Похоже, что для этого нет возможности. Плагин protoc-gen-go-grpc записывает выходной сервисный код в один и тот же файл с _grpc.pb.go суффиксом, где «сервис» включает как клиентский, так и серверный код.

Вы можете определить только разные пути вывода для каждого плагина:

  • protoc-gen-go поддержка --go_out и --go_opt флаги
  • protoc-gen-go-grpc поддержка --go-grpc_out и --go-grpc_opt флаги