Лучшая практика для создания прото-репо при использовании Go Modules - PullRequest
0 голосов
/ 11 июля 2019

tl; dr Репо, ранее настроенное для использования GOPATH, теперь настроено для модулей. Все хорошо и лучше. Однако protoc правильно (!) Генерирует код Golang для protobuf, определенных в репозитории в структуре github.com/path/to/repo/protos, когда я предпочел бы, чтобы они генерировались в моих источниках, за исключением GOPATH. Я перемещаю их, чтобы решить это. Есть ли лучшее решение?


У меня есть репозиторий на GitHub. Для обсуждения давайте назовем это github.com/acme/toolbox. В подкаталоге у меня есть файлы protobuf, которые включают:

package acme.toolbox.v1;
option go_package = "github.com/acme/toolbox/protos";

Когда я был GOPATH, все было хорошо, и protoc генерировал бы привязки Голанга в $GOPATH/src/github.com/acme/toolbox/protos, и мой код, импортирующий pb "github.com/acme/toolbox/protos", работал бы.

Переход на Модули Go не безболезненен, но преимущества перевешивают стоимость, и я проверяю будущее и себя, и код.

Моя проблема в том, что я не понимаю, как заставить protoc генерировать привязки Голанга в произвольно и вне GOPATH расположенного клона.

Я перемещаю файлы после того, как они сгенерированы, но это кажется ... неэлегичным:

cd ${TOOLBOX}
protoc \
--proto_path=./protos \
--go_out=plugins=grpc:/go/src
./protos/*.proto
mv ${GOPATH}/src/github.com/acme/toolbox/protos/*.go ${TOOLBOX}/protos

Есть ли лучшее решение?

1 Ответ

1 голос
/ 11 июля 2019

Суть опции go_package состоит в том, чтобы определить, каким будет имя пакета go. С учетом сказанного, он может вести себя по-разному в зависимости от того, что вы установите его.

Если option go_package определено как действительное имя пакета go (например, protos), protoc создаст файлы в папке, определенной --go_out с этим именем пакета. Если вместо option go_package указан путь (например, github.com/acme/toolbox/protos), protoc создаст структуру папок, определенную относительно --go_out, и поместит туда файлы с именем пакета, совпадающим с последним имя папки.

Если я не ошибаюсь в том, что вы хотите сделать, вы можете изменить go_package на:

option go_package = "protos";

и измените ваш protoc вызов на:

protoc \
--proto_path=./protos \
--go_out=plugins=grpc:${TOOLBOX}/protos
./protos/*.proto

При этом сгенерированные файлы будут помещены в ${TOOLBOX}/protos с пакетом go package protos.

...