Protobuf: импортировать известные типы (например, отметку времени) с google.golang.org/protobuf

До сих пор я использовал 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. Есть ли?

Вы используете очень старую (июль 2020 г.) версию (v3.12.4) protoc. Вам следует перейти на более новую версию protoc, а также protoc-gen-go и protoc-gen-go-grpc, чтобы генерировать заглушки Go, которые ссылаются на новые реализации общеизвестных типов Google (WKT). Ссылки WKT в ваших прототипах не меняются (google/protobuf/timestamp.proto), но сгенерированные заглушки будут исправлены.

DazWilkin 31.03.2023 20:01

@DazWilkin Спасибо за ваш ответ! Похоже, v3.12.4 — это последняя версия, которую я могу получить с помощью sudo apt update && sudo apt upgrade protobuf-compiler, поэтому я взял ее за последнюю версию. Но я найду способ! :)

NotX 31.03.2023 20:30

@DazWilkin Путь найден. (Я установил вручную.) Я не ожидал, что protoc придет с логикой для сгенерированных go файлов, но поскольку загруженные установочные файлы поставлялись с папкой include, содержащей типы, которые я искал, я могу, по крайней мере, увидеть, где исходит решение. Не стесняйтесь создавать ответ, я с радостью приму его!

NotX 31.03.2023 20:41

Рад, что это сработало! Вы правы, вам не нужно обновлять protoc только protoc-gen-go* плагины, но поддерживать валюту — хорошая идея. Я опубликую как ответ. Спасибо!

DazWilkin 31.03.2023 20:53
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
1
4
104
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это сбивает с толку, потому что Google изменил версию Go с версии 1 (github.com/golang/protobuf) на версию 2 (google.golang.org/protobuf).

README для v2 содержит хороший синопсис, и об этом также была запись в блоге (которую я больше не могу найти), но см. Новый Go API для протокольных буферов.

Это изменение (до версии 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/, но содержит обновленные известные типы. ;)

NotX 31.03.2023 21:15

Интересный. К вашему предыдущему комментарию, учитывая, что генерация кода Go выполняется плагинами Go, в этом не должно быть необходимости. Хм!? В Linux, если вы добавите protoc к PATH, то include должен быть включен автоматически и не требует дополнительной работы. Это был ваш опыт?

DazWilkin 31.03.2023 21:23

Да, поэтому я так удивился. И да, исполняемый файл bin/protoc, кажется, ищет папку ../include/, и она содержит (теперь обновленные) типы.

NotX 31.03.2023 21:26

Другие вопросы по теме