最近要把项目中的某块数据结构的序列化换成protobuf,遇到了引用其他.proto文件中结构的问题。查了很多资料总算解决了,这里记录一下。

先说一下我的当前开发环境

- windows 10 1903
- go1.12.7 windows/amd64
- 当前项目使用go.mod来维护依赖关系
- visual studio code + ms-vscode.go插件 + zxh404.vscode-proto3插件

项目代码结构示意

- myproject
    - dir1
        - package_a
            - a.proto
    - dir3
        -package_b
            - b.proto
    

a.proto中需要引用b.proto中定义的结构。此时在b.proto中就按照标准写法定义结构

syntax = "proto3";
package b;

message StructB {
    bool test = 1;
}

然后在a.proto中引用

syntax = "proto3";
package a;
import "project_module/dir3/package_b/b.proto"

message StructA {
    package_b.StructB test = 1;
}

这里的project_module指的是go.mod中的module名称。然后这么配置的时候,zxh404.vscode-proto3插件会提示import的路径不存在,以及package_b。StructB未定义;忽略这些错误。

最后将当前目录切换到my_project的上级目录,执行

protoc --go_out=. ./my_project/dir1/package_a/a.proto

my_project名称要与module名称一致,protoc会先根据./my_project/dir1/package_a/a.proto路径找到文件,然后根据import的路径找到引用的元素;注意这里都是根据路径。protoc没有关心module名称。