尽管在导入的.proto文件中定义了未定义的函数



我在同一目录中有两个.proto文件,因此second.proto依赖于first.proto

秒。原型

import "first.proto"
enum ThingINeed {
...something
}

我运行这些命令没有问题:

$ protoc --go_out=generatedsources/first -I. first.proto
$ protoc --go_out=generatedsources/second -I. second.proto

所以目录结构看起来有点像

src
|-first.proto
|-second.proto
|-generatedsources
|-first
|-first.pb.go
|-second
|-second.pb.go

我的问题是当我运行时

$ cd generatedsources/second
$ go build second.pb.go 

我收到

/second.pb.go:未定义:ThingINeed

因为second.pb.go使用来自first.pb.goThingINeed(也见于first.proto(

我注意到second.pb.go中没有import . "generatedsources/first"行。当我手动放入它时,它工作得很好。但我不应该编辑这些.pb.go文件,所以我想知道如何解决这个问题。我也不希望编辑这些.proto文件。

我认为在组织文件时可以反其道而行之。也就是说,有一个generatedsources目录和尽可能多的.proto文件源目录。将所有CCD_ 13文件保存在同一位置;"找到彼此";自动地

这可以使用--go_out=...参数来实现。根据您的示例:

$ protoc --go_out=generatedsources -I. first.proto
$ protoc --go_out=generatedsources -I. second.proto

如果你想以不同的方式对.proto文件进行分组,你可以这样做:

$ protoc --go_out=generatedsources -I. set1/first.proto
$ protoc --go_out=generatedsources -I. set1/second.proto
$ protoc --go_out=generatedsources -I. set2/third.proto
$ protoc --go_out=generatedsources -I. set2/forth.proto

不过,所有文件都需要有不同的文件名。总的来说,这是个好主意。


参考文献:

  • 建议:重载选项go_package以指示go导入路径
  • 另一个目录中的proto文件最佳实践问题

最新更新