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

了解protobuf导入和输出相对路径

曾绯辞
2023-03-14

我相当肯定这是操作员的错误,我现在没有想清楚。

这是设置:

$GOPATH/src/github.com/<company>/<service a>/proto/a.proto
$GOPATH/src/github.com/<company>/<service b>/proto/b.proto

现在在proto文件中,我使用类似于go的导入(也许是问题),使得a.proto具有:导入"github.com/

我可能有两个不同的问题。

  1. 我无法使用go获取导入以正确编译:生成协议
  2. 我无法将输出a.pb.go文件放在$GOPATH/src/github.com/

我尝试了多种配置,可能组合不正确<代码>使用选项go\u package=“github.com/

go生成的多种变体;

go:generate protoc --proto_path=.:$GOPATH/src --go_out=$GOPATH/src a.proto
go:generate protoc --proto_path=.:$GOPATH/src --go_out=. a.proto 
go:generate protoc --go_out=import_prefix=github.com/<company>/:. api.proto

很明显,我对protoc如何看待导入路径和文件输出的理解很差。有人告诉我我做错了什么吗?

谢谢

在a.proto中更新#1;

option go_package = "github.com/<company>/<service a>/proto";

import "github.com/<company>/<service b>/proto/b.proto";

和go生成;

//go:generate protoc --proto_path=$GOPATH/src --go_out=$GOPATH/src/github.com/<company>/<service a>/proto a.proto

它是从proto目录中的go文件调用的。

我收到了错误;a.proto:文件不驻留在使用--proto_path(或-)指定的任何路径中。您必须指定一个--proto_pathch包含此文件。请注意,proto_path必须是. proto文件名的精确前缀--协议太傻了,无法确定两条路径(例如绝对路径和相对路径)何时是等价的(这比您想象的要难)。

我已确认$GOPATH已到达预期位置。

溶液

感谢希瓦姆·金达尔为我指明了正确的方向。导入操作与他的解决方案中描述的完全相同。输出是我滥用go\u out和option go\u包的问题。我使用go\u包指定输出位置,--go\u out指定根目录,类似于--proto\u路径。现在一切都正常了。

option go_package = "github.com/<company>/<service a>/proto";

//go:generate protoc --proto_path=$GOPATH/src/ --go_out=$GOPATH/src/ $GOPATH/src/github.com/<company>/<service a>/proto/a.proto

谢谢


共有1个答案

柯曦
2023-03-14
匿名用户

首先,选项go_package根本不适用于其他依赖项导入,它是Go包名称,其中将放置Go(a.pb.go文件)的新原型绑定。

现在转到输出文件位置,我可以看到您正在使用go generate。首先,它取决于您从哪个目录调用,如果在--go\u out=中使用的路径是相对路径。我会说使用绝对路径。如果要将输出文件放在您提到的位置,请使用go\u out=$GOPATH/src/github。com公司/

要在a.proto中正确导入另一个文件,请使用完全限定的导入路径。只需在go generate中使用proto\u path$GOPATH/src即可。此外,如果问题不起作用,请用您看到的错误更新问题。

有关导入路径的更多信息,请参阅此处。

 类似资料:
  • 本文向大家介绍快速了解Python相对导入,包括了快速了解Python相对导入的使用技巧和注意事项,需要的朋友参考一下 1、绝对导入和相对导入 绝对导入:按照sys.path顺序搜索,先主目录(sys.path中第一项''),然后PYTHONPATH环境变量、标准库路径、pth指定路径等。 相对导入:在模块所在同一个包内搜索,注意该包目录与主目录的区别。 例1:有以下目录 mod.py内容:imp

  • 问题内容: 给定相对路径,如何导入Python模块? 例如,如果包含和,和包含,我怎么导入到? 这是一个视觉表示: 希望包含,但是重组文件夹层次结构不是一种选择。 问题答案: 假设你的两个目录都是真实的Python包(文件中确实有文件),那么这是一个相对于脚本位置包含模块的安全解决方案。 我假设你想这样做,因为你需要在脚本中包括一组模块。我在多个产品的生产环境中使用了此功能,并在许多特殊情况下工作

  • 问题内容: 这是我的文件夹结构: 在我有: 在时: 现在,当我发出: 我得到: 由于“多份原件打印”是在sys.path中,并正确地解决它为什么抱怨相对进口上述顶层包? 这是顶层包 ? 顺便说一句,这是我向旧项目中添加测试的尝试-在Python测试包布局中曾提出过要求,但作为Python单元测试去哪儿的副本被关闭了。对我当前的测试包布局的评论深表感谢! 那么下面的答案不适用于我的情况: 该 模块

  • 问题内容: 我正在python 2.7中开发自己的模块。它位于而不是或中。内部结构为: 包括课程。我遇到导入问题: 我没有将PythonPath设置为包括我的,因此,当server.http尝试包含client.PyCachedClient时,它将尝试从相对路径加载它并失败。我的问题是- 我应该如何以良好的pythonic方式设置所有路径/设置?我知道每次打开控制台并尝试运行服务器时都可以在she

  • 主要内容:什么是当前工作目录,什么是绝对路径与相对路径,Python处理绝对路径和相对路径在介绍绝对路径和相对路径之前,先要了解一下什么是当前工作目录。 什么是当前工作目录 每个运行在计算机上的程序,都有一个“当前工作目录”(或 cwd)。所有没有从根文件夹开始的文件名或路径,都假定在当前工作目录下。 注意,虽然文件夹是目录的更新的名称,但当前工作目录(或当前目录)是标准术语,没有当前工作文件夹这种说法。 在 Python 中,利用 os.getcwd() 函数可以取得当前工作路径的字