【问题标题】:protobuf golang import .proto and .pb.proto from different directoriesprotobuf golang 从不同目录导入 .proto 和 .pb.proto
【发布时间】:2017-04-23 12:11:18
【问题描述】:

我有一个名为 myProtos 的库,看起来像这样

.
|-- proto
|---- hello.proto
|
|-- generated
└---- hello.pb.go

我在外部有一个名为 example.proto 的 .proto 文件,应该导入 hello.proto

所以文件的顶部看起来像这样:

syntax = "proto3";
package example;
import "path/to/myProtos/proto/hello.proto"

现在,当我编译 example.proto 时,example.pb.go 出现导入错误,因为它有导入行 import "path/to/myProtos/proto/hello.pb.go"

我尝试添加两个导入路径,但出现“导入但未使用错误”。我还尝试进行相对导入并将两个目录作为标志传递给 protoc,这很有效,但我需要 go 文件中的导入路径是绝对的。

如何告诉 protoc 在 go 文件中路径不同?

在这种情况下是否有更好的“最佳实践”?

【问题讨论】:

    标签: go protocol-buffers


    【解决方案1】:

    对我有用的是定义option go_package = "github.com/<your-account>/<your-cool-project>/<sub-dirs>

    假设您拥有您所说的文件夹结构:

    .
    |-- proto
    |---- hello.proto
    |
    |-- generated
    └---- hello.pb.go
    

    在您的情况下,您可以将option go_package = "<path>/<in>/<GOPATH>/generated" 添加到hello.proto。 重要的是你必须运行

    protoc -I. --go_out=$GOPATH ./*.proto
    

    一般来说,我会在 proto 文件旁边生成 go 文件,以保持 proto 和 go 文件的导入路径相同。但这可能是一个品味问题。在这种情况下,您只需将option go_package = "<path>/<in>/<GOPATH>/proto" 设置为hello.proto

    在这两种情况下,.proto 文件的相对导入现在应解析为生成的 Go 代码中的正确导入,.pb.go 文件也应放入正确的 Go 包文件夹中。

    【讨论】:

      【解决方案2】:

      在您的 hello.proto 文件中使用 package generated;

      然后,protoc -I proto/ proto/*.proto --go_out=generated 会在generated 文件夹内生成一个hello.pb.go,包名为generated

      proto 文件中的包告诉 protobuf 生成器在生成的文件中使用哪个包。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-04
        • 1970-01-01
        • 1970-01-01
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多