为了账号安全,请及时绑定邮箱和手机立即绑定

戈朗项目原始导入损坏

戈朗项目原始导入损坏

Go
绝地无双 2022-09-19 20:49:44
我不是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 保留为最终的“源”,并节省“缓存”生成源的时间。但是在这个配置中,我是我自己的第三方库维护者。

所以:

  1. 模块在本地表现为目录树,其根包含和表示包的子目录。go.modgo.sum

  2. 当您为第三方原型生成代码时,我认为最好在自己的模块下创建它,作为独立目录或作为供应商子目录。

  3. 此模块的命名应引用第三方,并且可以使用go mod initprotoc

  4. 模块通常是从代理或存储库中提取的,但您可以通过手动添加从模块路径到本地路径的重定向的替换来规避这一点(因为第三方不为您托管生成的代码)。go mod

  5. 从您的错误中,这应该解决缺少模块的问题,并使用子目录,例如 包含生成的代码,也应该解析包。company


查看完整回答
反对 回复 2022-09-19
  • 1 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号