将Golang1.11与模块一起使用时,Protobuf导入“找不到文件”

时间:2018-10-09 09:28:58

标签: go protocol-buffers

我使用具有模块支持的Golang 1.11,因此我的项目没有放入$GOPATH

我要编译proto文件,

我的文件结构

enter image description here


我的TaskInfo.proto

syntax = "proto3";
package chaochaogege.filecatcher.common;

option go_package = "common";

import "chaochaogege.com/filecatcher/common/ChunkInfo.proto";

message TaskInfo{
    string name = 1;
    string storePath = 2;
    uint32 workersNum = 3;
    uint32 totalSize = 4;
    repeated chaochaogege.filecatcher.common.ChunkInfo chunkInfo = 5;
}

ChunkInfo.proto

syntax = "proto3";
package chaochaogege.filecatcher.common;

option go_package = "common";

message ChunkInfo{
    uint32 startBytes = 1;
    uint32 endBytes = 2;
    uint32 totalBytes = 3;
    uint32 downloaded = 4;
    uint32 orderId = 5;

}

go.mod

module chaochaogege.com/filecatcher

require (
  github.com/golang/protobuf v1.2.0
)

当我运行时(在filecatcher / common目录中)

protoc --go_out=./ TaskInfo.proto

协议说:

chaochaogege.com/filecatcher/common/ChunkInfo.proto: File not found.TaskInfo.proto: Import "chaochaogege.com/filecatcher/common/ChunkInfo.proto" was not found or had errors.
TaskInfo.proto:13:14: "chaochaogege.filecatcher.common.ChunkInfo" is notdefined.

我已经用谷歌搜索,但是所有问题都不是关于go模块

我使用错误的导入路径还是我的配置不正确?

如果Stackoverflow无法解决我的问题,我认为这是一个错误。 我应该去Github报到。

2 个答案:

答案 0 :(得分:1)

好像您在混淆路径

您的导入路径是

import "chaochaogege.com/filecatcher/common/ChunkInfo.proto";

如果要从filecatcher / common内部运行protoc,则希望将导入缩短为import "ChunkInfo.proto"并运行您现在尝试运行的命令。它将起作用。

但是,如果您想保持导入语句的原样,则必须导航到chaochaogege.com的父目录,并从那里运行以下命令,如下所示:

protoc -I chaochaogege.com/filecatcher/common/ chaogege.com/filecatcher/common/ChunkInfo.proto --go_out=chaochaogege.com/filecatcher/common/

答案 1 :(得分:0)

我知道这个问题已经有了一个可以接受的答案,但是我想分享对我有用的东西,并加强被接受的解决方案所陈述的两个建议之一。

我发现无论我在何处运行protoc命令(无论是从项目目录的源还是包含原始文件的子目录),都将导入路径缩短为仅文件名(即ChunkInfo.proto)起作用。请注意,我所有的原始文件都在同一个子目录中。

将完整的路径从项目目录的源导入到proto文件对我来说不起作用,我不确定为什么。希望这可以帮助。