编译TensorFlow Serving Protobuf到Go语言时遇导入路径错误求助
问题原因
你遇到的错误是因为TensorFlow Serving的.proto文件没有定义go_package选项,protoc-gen-go需要明确的Go导入路径才能生成代码。--proto_path参数仅用于指定protoc搜索依赖proto文件的路径,解决的是导入文件找不到的问题,和Go代码的导入路径无关,所以之前的尝试无法解决当前错误。
解决方案
有两种可行的解决方式,推荐第一种(无需修改原proto文件):
方式1:命令行通过--go_opt=M参数指定路径映射
在编译命令中,用--go_opt=M<proto文件路径>=<Go导入路径>的格式,为每个依赖的proto文件指定对应的Go包路径。
假设你的output_dir对应的Go模块路径是your/module/path(比如你的项目模块名是github.com/yourname/tfserving-client,就填该模块名),完整编译命令如下:
protoc --proto_path=. \ --go_out=./output_dir \ # 映射TensorFlow核心proto的Go路径 --go_opt=Mtensorflow/core/example/example.proto=your/module/path/tensorflow/core/example \ --go_opt=Mtensorflow/core/framework/*.proto=your/module/path/tensorflow/core/framework \ --go_opt=Mtensorflow/core/protobuf/*.proto=your/module/path/tensorflow/core/protobuf \ # 映射TensorFlow Serving的proto路径 --go_opt=Mtensorflow_serving/apis/*.proto=your/module/path/tensorflow_serving/apis \ --go_opt=Mtensorflow_serving/config/*.proto=your/module/path/tensorflow_serving/config \ # 指定要编译的TensorFlow Serving proto文件 tensorflow_serving/*/*.proto
注意:如果
output_dir就在Go模块根目录下,your/module/path可以直接用./output_dir或者省略前缀直接写tensorflow/...,只要保证生成的Go文件导入路径和实际目录结构一致即可。
方式2:修改原proto文件添加go_package选项
直接在每个TensorFlow Serving的.proto文件开头添加go_package选项,比如在tensorflow_serving/apis/input.proto顶部添加:
option go_package = "your/module/path/tensorflow_serving/apis";
完成所有需要编译的proto文件修改后,执行编译命令:
protoc --proto_path=. --go_out=./output_dir tensorflow_serving/*/*.proto
这种方式的缺点是需要修改原文件,后续更新TensorFlow Serving的proto时需要重新添加该选项,维护成本较高。
验证
编译完成后,检查output_dir下的目录结构是否和proto的包结构对应,比如tensorflow_serving/apis目录下会生成对应的.pb.go文件,且文件中的package声明与指定的Go路径一致。
内容的提问来源于stack exchange,提问作者Regalia

