Что нужно писать в файлах proto в option go_package?
Всем привет. Пытаюсь разобраться в кодогенерации protobuf. В данный момент в файлах .proto обязательно должна быть опция option go_package . Но я не пойму что тут указывать... Или у меня проблема в понимании структуры папок.
Если я указываю "example.com/project/protos/fizz" , то protoc создаст мне 4 папки (example.com, project. protos. fizz). Не уверен что это правильно. Но даже если так, то потом не получается подключить сгенерированный файл. Если делать go mod init ... , то опять непонятно что указывать в go_package. Команда go mod tidy, не может найти этот пакет.
Мне нужно загружать код на гитхаб и уже путь с гитхаба указывать? А если я хочу просто поэкспериметровать на компе, без гитхаба. Вопрос наверно простой, но прошу помочь разобраться, чтобы в голове улеглось. Дока от гугла ответов не дала, ну или я не там читаю.
Нужно указать полный путь до пакета, где будут лежать сгенерированные файлы.
В вашем случае (если будете держать сгенерированные и прото файлы в /protos/fizz)
option go_package = "example.com/project/protos/fizz";
далее запускаете генерацию с опцией
--go_opt=paths=source_relative
If the paths=source_relative flag is specified, the output file is placed in the same relative directory as the input file. For example, an input file protos/buzz.proto results in an output file at protos/buzz.pb.go.
правильно подключен сгенерированный person.pb.go ?
вылезает ошибка main.go:5:2: no required module provides package example.com/project/protos/person: go.mod file not found in current directory or any parent directory; see 'go help modules'
то есть голанг настаивает, чтобы я делал как модуль?
файл создался в той же директории что и proto файл.
Да, верно, так и должно быть. Главное чтобы он лежал по верному пути.
то есть голанг настаивает, чтобы я делал как модуль?
Судя по всему, у вас версия go 1.16, в ней модули включены по умолчанию.
Я бы советовал всегда использовать модули, не зависимо от того, будете ли вы выкладывать код в репозиторий или нет, при этом код может лежать где угодно, а не обязательно в GOPATH.
Имя модуля может не быть путём до репозитория(но желательно, а для open source проектов, обязательно), это может быть даже просто "my-project" (тогда будет import "my-project/protos/person").
Владислав,
делаю все заново.
команды:
go mod init my-project
protoc --go_out=. --go_opt=paths=source_relative *.proto
go mod tidy
в proto: option go_package = "example.com/project/protos/person";
ошибка при подключении "my-project/protos/person"
main.go:5:2: package my-project/protos/person is not in GOROOT (/usr/local/go/src/my-project/protos/person)
если модуль будет называться example.com/project , то все равно ошибка при подключении "example.com/project/protos/person"
no required module provides package example.com/project/protos/person; to add it:
go get example.com/project/protos/person