当前位置: 首页 > 知识库问答 >
问题:

proto:文件已在不同的包中注册

闾丘永春
2023-03-14

我有2个proto在不同的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"

这里是常见的。测试平台存储库中的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\u包和包的包定义与github中的包没有冲突。com/soft/proto-asterix/asterix。只有。proto文件名类似(common.proto)。

我使用protoc生成go文件,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-名称空间冲突应该附加包和文件名以检查注册冲突,但这里的情况似乎不是这样。

有人遇到过这样的行为吗?我是否错过了解决此包名冲突的明显方法?

以下是我尝试的内容:

  • 向“公用”添加/删除“程序包”指令。proto文件

Protoc版本:libprotoc 3.15.7 Protoc go插件版本:Protoc gen go v1.26.0

共有2个答案

武晨
2023-03-14

接受的答案不再正确。此提交恢复了“错误修复”,因为它与其他gRPC实现不同。

我解决这个问题的唯一方法是重命名文件/文件夹。

司徒宏远
2023-03-14

多亏了@blackgreen的建议,这确实是一个由https://go-review.googlesource.com/c/protobuf/ /301953/

虽然protoc gen go的下一个版本即将发布,但以下是您项目的快速修复:

go install google.golang.org/protobuf/cmd/protoc-gen-go@febffdd
google.golang.org/protobuf v1.26.1-0.20210525005349-febffdd88e85

你该走了!

 类似资料:
  • 我的原始文件使用默认的谷歌协议缓冲区类型,如结构和时间戳。 使用默认的gradle协议集成,gradle输出错误,因为它无法解决导入: google/protobuf/struct。proto:找不到文件。 google/protobuf/timestamp。proto:找不到文件。 替换默认的gradle协议块 其中一个指定protoc的位置 修复了该问题,但它不可移植。 是否有任何jar依赖项

  • 我有两个proto-src文件,在同一个文件夹中,比如说: 第一个是foo。协议 第二个是

  • 问题内容: 我有一个目录结构如下的项目: 我应该如何编写一个可以在part / src中(或在任何地方)的makefile来在部分c / c ++源文件中完成/链接?/ src? 我可以做一些事情-I $ projectroot / part1 / src -I $ projectroot / part1 / inc -I $ projectroot / part2 / src … 如果那行得通,

  • 问题内容: 我正在做一个大项目,该项目很可能最终包含成千上万行代码,对于当前结构,我喜欢这样: 这样做的问题是controllers和models目录包含很多文件,全部使用和。因此,我正在考虑将其拆分为: 凡在控制器包的用户文件中可能包含的文件,等等。 现在,我读到像或那样的软件包是不好的做法,但是我担心对这两个软件包进行命名可能不是一个好主意,因为它们是同一项目的一部分(即使它们位于不同的目录中

  • <代码>协议--gogofaster\u out=。形象协议 我收到此错误消息 /主页/abc/src/github。com/gogo/protobuf/gogoproto/gogo。proto:找不到文件。 形象proto:Import“/主页/abc/src/github.com/gogo/protobuf/gogoproto/gogo.proto”未找到或有错误。 文件肯定在那里。我可以从错

  • 我是protobuf的新手。遵循官方教程https://developers.google.com/protocol-buffers/docs/gotutorial,我下载了最新版本,并尝试运行示例 下的src,以便所需的包和。proto和proto位于同一目录下(由-I=src指定)。 然而,我想知道,如果有一个解决方案时。proto文件和其他要导入的包位于不同的目录下。