Правильный формат proto c go_package? - PullRequest
6 голосов
/ 07 мая 2020

У меня есть существующий проект в Go, где я использую Protocol buffers / gRP C. До недавнего времени опция go_package была необязательной, и результирующее имя пакета Go было бы таким же, как имя прототипа пакета.

Этот файл находится в проекте root. Сгенерированный файл кода (authenticator.pb.go) находится в том же месте. Файл прото:

syntax = "proto3";

package authenticator;

service Authenticator {...}

Команда генерации указывает, что я хочу выводить в том же каталоге:

protoc --go_out=plugins=grpc:. authenticator.proto

Сегодня я вытащил новую версию компилятора буферов протокола и github.com/golang/protobuf/protoc-gen-go. При первом запуске появилось предупреждение:

WARNING: Missing 'go_package' option in "authenticator.proto",
please specify it with the full Go package path as
a future release of protoc-gen-go will require this be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.

Предложенная ссылка более-менее бесполезна. Но в руководстве более подробно:

Параметр go_package определяет путь импорта пакета, который будет содержать весь сгенерированный код для этого файла. Имя пакета Go будет последним компонентом пути импорта. Например, в нашем примере будет использоваться имя пакета «tutorialpb».

option go_package = "github.com/protocolbuffers/protobuf/examples/go/tutorialpb";

После добавления этой опции в файл proto и повторного выполнения команды выходные данные попадают в этот путь относительно проект root. Что-то вроде:

$GOPATH/src/github.com/<org>/authenticator/github.com/<org>/authenticator/authenticator.pb.go

Я пробовал следующие альтернативы в качестве go_package имен:

  • .
  • authenticator

Генерация произошла в правильном месте, но я получил предупреждение:

WARNING: Deprecated use of 'go_package' option without a full import path...

Итак, каков правильный способ без нарушения макета проекта?

Ответы [ 4 ]

5 голосов
/ 23 июня 2020

Для чистых прототипов вы можете сделать следующее

protoc --go_out=paths=source_relative:./gen -I. authenticator.proto

или для генерации для grp c можно использовать следующее

protoc --go_out=plugins=grpc:./gen --go_opt=paths=source_relative authenticator.proto

Это просто Google, принимающий отдельные решения еще раз о том, как вы должны писать и управлять своим кодом. Однако, если вы разобрались с достаточным количеством проблем людей, имеющих похожие проблемы , я обнаружил, что теперь можно использовать указанную выше команду. В дополнение к добавлению полного пути импорта, как показано в другом ответе

option go_package = "github.com/example/path/gen;gen";

Следуя приведенному выше пакету и команде proto c, у вас будет ваш файл proto в проекте root с именем модуля github.com/example/path. Затем ваш код будет помещен в папку gen, за создание которой вы будете отвечать.

Возможно, вам потребуется настроить выходное местоположение source_relative для вашего использования, но, по крайней мере, вы не получите дублирование paths или повторное размещение кода в GOPATH.

Это может не работать в дальнейшем из-за дополнительных изменений, обнаруженных в этом билете . К сожалению, двоичное имя точно такое же, поэтому, если вы столкнетесь с проблемами, прочтите этот билет и попробуйте переключить версию, которую вы установили, пока новый протокол c -gen- go не будет готов для производства.

3 голосов
/ 15 июля 2020

Вам просто нужно добавить параметр Go, который сообщит, что нужно добавить файл относительно файла proto.

protoc --go_out=. --go_opt=paths=source_relative your_file.proto 

Это сделает your_file.pb. go в том же каталоге, что и your_file. прото

1 голос
/ 23 мая 2020

Вышеупомянутая ошибка исчезла, когда я добавил

option go_package = "github.com/monkrus/grpc-from0;grpc_from0";, как показано ниже:

chat.proto

0 голосов
/ 07 мая 2020

Хотя документация не отображается, я заставил это работать, установив выходной каталог на GOPATH/src.

protoc --go_out=plugins=grpc:$(go env GOPATH)/src authenticator.proto 

Надеюсь, это поможет кому-то сэкономить время.

...