我不是golang开发人员,但目前我必须修复代码,所以如果我不小心不理解Go的一些基本概念,请提前;)我有一个第三方合同,我必须使用,我没有影响力。我无法提供合约的实际示例,所以我在Github上制作了类似的示例项目,该项目也存在同样的问题。简而言之:文档有一个深度嵌套的结构,其中一些文档导入其他文档:protobufprotosyntax = "proto3";package company.nested1.nested2;import "company/common.proto";option go_package = "nested2";message CompanyMessage { CompanyEnum compEnum = 1;}引用syntax = "proto3";package company;option go_package = "company";enum CompanyEnum { VAR1 = 0; VAR2 = 1;}有一个包含以下代码的文件:go.modmodule go-programgo 1.16require ( github.com/golang/protobuf v1.5.2 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/grpc v1.40.0 // indirect google.golang.org/protobuf v1.26.0)在编译到 Golang 代码时,此导入中存在一个问题。生成的文件具有相对于包的导入,而它们在具有 root 的 go 项目中使用时,无法解析这些导入:*.pb.gocompanygo-project据我所知,以前这个问题已经通过手动编辑生成的文件中的导入来解决。就像下面的屏幕一样。但在我看来,应该有更好的方法来解决这个问题;)我正在使用此命令从原型文件生成 go 代码:protoc --proto_path=proto (find proto -name '*.proto') --go_out=plugins=grpc:.所以问题是:解决这种进口问题的正确方法是什么。似乎生成的文件中的导入应该从我的程序根命名空间开始。但是如何实现这一点 - 也许有些选项在命令中我没有找到。我还尝试将生成的文件放在内部或内部,并尝试制作和发布单独的模块 - 没有结果。有没有一些合适的解决方案?protoc$GOPATH/srcvendors
1 回答

繁花如伊
TA贡献2012条经验 获得超12个赞
这更像是一些指针,而不是一个明确的答案。如果我明天有时间,我会重现这一点,给你一个明确的答案。
这是具有挑战性的。Protobufs必须为每种语言的包管理找到解决方案,而Go的(虽然IMO改进了)随着最近添加的模块而有些复杂。
我对代码的处理方法是为原型和生成的代码提供一个单独的存储库。如果原型发生更改,则会重新生成代码。我可以引用生成的模块(!),也可以重新生成自己。此模型将 protos 保留为最终的“源”,并节省“缓存”生成源的时间。但是在这个配置中,我是我自己的第三方库维护者。
所以:
模块在本地表现为目录树,其根包含和表示包的子目录。
go.mod
go.sum
当您为第三方原型生成代码时,我认为最好在自己的模块下创建它,作为独立目录或作为供应商子目录。
此模块的命名应引用第三方,并且可以使用
go mod init
protoc
模块通常是从代理或存储库中提取的,但您可以通过手动添加从模块路径到本地路径的重定向的
替换
来规避这一点(因为第三方不为您托管生成的代码)。go mod
从您的错误中,这应该解决缺少模块的问题,并使用子目录,例如 包含生成的代码,也应该解析包。
company
- 1 回答
- 0 关注
- 94 浏览
添加回答
举报
0/150
提交
取消