Понимание относительного пути импорта и вывода protobuf - PullRequest
0 голосов
/ 22 апреля 2020

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

Вот настройка:

$GOPATH/src/github.com/<company>/<service a>/proto/a.proto
$GOPATH/src/github.com/<company>/<service b>/proto/b.proto

et c.

Теперь в файле прото я использую импорт, аналогичный go (возможно, проблема), так что a.proto имеет: import "github.com/<company>/<service b>/b.proto"

У меня возможно две отдельные проблемы.

  1. Не удается получить импорт для правильной компиляции, используя go:generate protoc
  2. Не удается получить выходной файл a.pb.go для размещения в пути $GOPATH/src/github.com/<company>/<service a>/proto/.

Я пробовал несколько конфигураций, вероятно, не в правильной комбинации. Using option go_package = "github.com/<company>/<service b>/proto" в каждом .proto файле

Несколько вариантов генерации go;

go:generate protoc --proto_path=.:$GOPATH/src --go_out=$GOPATH/src a.proto
go:generate protoc --proto_path=.:$GOPATH/src --go_out=. a.proto 
go:generate protoc --go_out=import_prefix=github.com/<company>/:. api.proto

Я явно плохо понимаю, как прото c смотрит на пути импорта и файл выходы. Кто-нибудь указывает мне, что я делаю неправильно?

Спасибо!

Обновление # 1 В a.proto;

option go_package = "github.com/<company>/<service a>/proto";

import "github.com/<company>/<service b>/proto/b.proto";

и go generate;

//go:generate protoc --proto_path=$GOPATH/src --go_out=$GOPATH/src/github.com/<company>/<service a>/proto a.proto

, который вызывается из файла go в каталоге proto с a.proto.

Я получил ошибку; a.proto: файл не находится ни в каком пути, указанном с помощью --proto_path (или -I). Вы должны указать --proto_path ch, охватывающий этот файл. Обратите внимание, что proto_path должен быть точным префиксом имен файлов .proto - proto c слишком глуп, чтобы понять, когда два пути (например, абсолютный и относительный) эквивалентны (это сложнее, чем вы думаете).

Я подтвердил, что $ GOPATH находится в ожидаемом месте.

Решение

Спасибо Шиваму Джиндалу за то, что он указал мне правильное направление. Импорт в точности как описано в его решении. Вывод был проблемой моего неправильного использования --go_out и опции go_package. Я использовал go_package, чтобы указать расположение вывода, и --go_out, чтобы указать root, аналогичный --proto_path. Теперь все работает.

option go_package = "github.com/<company>/<service a>/proto";

и

//go:generate protoc --proto_path=$GOPATH/src/ --go_out=$GOPATH/src/ $GOPATH/src/github.com/<company>/<service a>/proto/a.proto

Спасибо!

1 Ответ

0 голосов
/ 22 апреля 2020

Во-первых, option go_package вообще не предназначен для импорта других зависимостей, это имя пакета Go, в которое будут помещены новые прото-привязки для Go (a.pb.go file).

Теперь перейдя к расположению выходного файла, я вижу, что вы используете go -генерировать. Во-первых, это зависит от того, из какого каталога вы вызываете, если путь, используемый в --go_out=, является относительным путем. Я бы сказал, использовать абсолютные пути. Если вы хотите поместить выходной файл в указанное вами место, используйте --go_out=$GOPATH/src/github.com/<company>/<service a>/proto/ в go -генерировать.

Чтобы правильно импортировать другой файл b.proto в a.proto, используйте полный путь импорта, как вы уже сделали. Просто используйте --proto_path $GOPATH/src в go -генерируемый. Также, пожалуйста, обновите вопрос с ошибками, которые вы видите в случае, если он не работает.

Пожалуйста, смотрите this для получения дополнительной информации о путях импорта.

...