proto: файл уже зарегистрирован в разных пакетах

У меня есть 2 прототипа, скомпилированных под разные пакеты go, но когда я регистрирую их на сервере и запускаю его, я получаю:

panic: proto: file "common.proto" is already registered
    previously from: "github.com/soft/test-platform.go/common"
    currently from:  "github.com/soft/proto-asterix/asterix"

Вот common.proto в репозитории тестовой платформы (в папке /api):

syntax = "proto3";
package soft.testplatform.common; // here I do defint a UNIQUE package name !

option java_multiple_files = true;
option go_package = "github.com/soft/test-platform.go/common"; // Here I do define a unique go package name !

message MyMessage{
    string commandId = 1;
}

Как видите, определение пакета для go_package и package не конфликтует с пакетом с github.com/soft/proto-asterix/asterix. Похожи только имена файлов .proto (common.proto).

Я генерирую файлы go с protoc плагином protoc-gen-go, используя следующую команду:

protoc \
--proto_path=../test-platform/api/   \
--go_out=./common --go_opt=paths=source_relative \
../test-platform/api/common.proto

Согласно документации здесь https://developers.google.com/protocol-buffers/docs/reference/go/faq#fix-namespace-conflict пакет и имя файла должны быть добавлены для проверки наличия конфликта регистрации, но здесь это не так.

Кто-нибудь сталкивался с таким поведением? Я пропустил что-то очевидное для разрешения этого конфликта имени пакета?


Вот что я пробовал:

  • Добавление/удаление инструкции package в файл common.proto
  • Измените команду протокола, чтобы использовать абсолютную (а не относительную) proto_path

Версия Protoc: libprotoc 3.15.7 Версия плагина Protoc go: protoc-gen-go v1.26.0


person Antonin    schedule 25.05.2021    source источник
comment
Эта проблема обсуждалась в системе отслеживания ошибок Go: github.com/golang/protobuf/issues/1122. да, у вас не может быть файлов с одинаковыми именами. Кажется, это было исправлено совсем недавно. Для справки, в предыдущих выпусках это просто предупреждало   -  person blackgreen    schedule 25.05.2021
comment
Как я могу узнать, когда я импортирую сгенерированный код прототипа, какие файлы были использованы для файлов .proto? Также не делает ли это ключевое слово пакета бесполезным?   -  person Antonin    schedule 25.05.2021


Ответы (1)


Благодаря предложению @blackgreen, действительно, эта ошибка была исправлена ​​https://go-review.googlesource.com/c/protobuf/+/301953/

Пока вышел следующий выпуск protoc-gen-go, вот быстрое решение для ваших проектов:

Используйте фиксированный протокол protoc-gen-go :

go install google.golang.org/protobuf/cmd/protoc-gen-go@febffdd

Измените свой импорт в go.mod, чтобы он соответствовал

google.golang.org/protobuf v1.26.1-0.20210525005349-febffdd88e85

Тебе должно быть хорошо идти!

person Antonin    schedule 25.05.2021
comment
Возможно, даже нет необходимости использовать фиксированный протокол protoc-gen-go (шаг установки), и, возможно, может быть достаточно использовать фиксированную среду выполнения протокола в проектах, регистрирующих сервер протокола: не тестировалось. - person Antonin; 26.05.2021
comment
У меня была такая же проблема с именем пакета, и имя прото-файла такое же. Итак, я изменил имя прото-файла и имя папки, а также имя пакета во втором репо, и я все еще получаю тот же файл ошибки, который уже зарегистрирован, хотя, поскольку я изменил имя файла, файл, который он упоминает, даже не существует во втором упаковка больше. Есть идеи? - person Akil Demir; 03.06.2021
comment
как предложил Антонин, просто обновил зависимость в go.mod в сервисе и построил заново, заработало! - person Anton Zhukov; 15.06.2021