До сих пор я использовал github.com/golang/protobuf
. Сегодня я получил предупреждение module github.com/golang/protobuf is deprecated: Use the "google.golang.org/protobuf" module instead.
Так я и сделал, и переход прошел гладко. Но мой проект все еще зависит от github.com/golang/protobuf
, репозитория, от которого я хочу избавиться. Причина в том, что я использую известные типы в .proto
файлах:
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";
Когда я запускаю protoc
(v3.12.4
) для создания соответствующих файлов Go, это будет разрешено
import (
timestamp "github.com/golang/protobuf/ptypes/timestamp"
wrappers "github.com/golang/protobuf/ptypes/wrappers"
)
, из-за чего устаревшая зависимость все еще используется.
Не уверен, имеет ли это значение, но я полагаюсь на эти protoc
плагины:
$ go install google.golang.org/protobuf/cmd/[email protected]
$ go install google.golang.org/grpc/cmd/[email protected]
, которые являются последними, насколько я могу судить.
В поисках последнего типа timestamp
я наткнулся на https://pkg.go.dev/google.golang.org/protobuf/types/known/timestamppb. URL-адрес предполагает, что он может принадлежать нужному пакету google.golang.org/protobuf
, но я не знаю, как его правильно импортировать. Базовый репозиторий github содержит файл readme, в котором говорится:
types/known/timestamppb: Package timestamppb is the generated package for google/protobuf/timestamp.proto.
Но google/protobuf/timestamp.proto
— это импорт, который я сейчас использую в своем файле .proto
, и я все еще получаю import timestamp "github.com/golang/protobuf/ptypes/timestamp"
, что является устаревшей зависимостью.
Я немного не понимаю, как разобраться во всей этой зависимости, и я не знаю, где найти недостающую часть, чтобы избавиться от зависимости github.com/golang/protobuf
. Есть ли?
@DazWilkin Спасибо за ваш ответ! Похоже, v3.12.4
— это последняя версия, которую я могу получить с помощью sudo apt update && sudo apt upgrade protobuf-compiler
, поэтому я взял ее за последнюю версию. Но я найду способ! :)
@DazWilkin Путь найден. (Я установил вручную.) Я не ожидал, что protoc
придет с логикой для сгенерированных go
файлов, но поскольку загруженные установочные файлы поставлялись с папкой include
, содержащей типы, которые я искал, я могу, по крайней мере, увидеть, где исходит решение. Не стесняйтесь создавать ответ, я с радостью приму его!
Рад, что это сработало! Вы правы, вам не нужно обновлять protoc
только protoc-gen-go*
плагины, но поддерживать валюту — хорошая идея. Я опубликую как ответ. Спасибо!
Это сбивает с толку, потому что Google изменил версию Go с версии 1 (github.com/golang/protobuf
) на версию 2 (google.golang.org/protobuf
).
Это изменение (до версии 2) также включало новые (сгенерированные) пакеты Go (!) для Общеизвестных типов Google см. Указатель пакетов.
Следствием этих изменений является то, что вы должны обновить protoc-gen-go и protoc-gen-go-grpc и, пока вы это делаете, обновить protoc
( v3.12.4) устарело (июль 2020 г.). Новые плагины будут генерировать заглушки Go, которые правильно ссылаются на новые заглушки GWT Go, предоставленные Google.
Релиз protoc-gen-go
, в котором произошло переключение API, — 1.4.0, см. «Обзор».
Ссылки на прото import
(например, google/protobuf/timestamp.proto
) не изменились.
Я мог бы добавить: он не обновляется protoc
"пока я этим занимаюсь" - это был решающий шаг, чтобы избавиться от github.com/golang/protobuf
. И, возможно, также стоит упомянуть, что официальное руководство по установке советует вам сначала использовать apt
, но репозиторий protoc
сильно устарел (как и snap
). Вместо этого вам нужно установить его вручную. И не забудьте скопировать папку include/
, которая находится рядом с bin/
, но содержит обновленные известные типы. ;)
Интересный. К вашему предыдущему комментарию, учитывая, что генерация кода Go выполняется плагинами Go, в этом не должно быть необходимости. Хм!? В Linux, если вы добавите protoc
к PATH
, то include
должен быть включен автоматически и не требует дополнительной работы. Это был ваш опыт?
Да, поэтому я так удивился. И да, исполняемый файл bin/protoc
, кажется, ищет папку ../include/
, и она содержит (теперь обновленные) типы.
Вы используете очень старую (июль 2020 г.) версию (v3.12.4)
protoc
. Вам следует перейти на более новую версиюprotoc
, а такжеprotoc-gen-go
иprotoc-gen-go-grpc
, чтобы генерировать заглушки Go, которые ссылаются на новые реализации общеизвестных типов Google (WKT). Ссылки WKT в ваших прототипах не меняются (google/protobuf/timestamp.proto
), но сгенерированные заглушки будут исправлены.