Я вполне уверен, что это ошибка оператора, и я нахожусь в точке, в которой я не совсем ясно представляю.
Вот настройка:
$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"
У меня возможно две отдельные проблемы.
- Не удается получить импорт для правильной компиляции, используя
go:generate protoc
- Не удается получить выходной файл
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
Спасибо!