Golang原始文件管理和导入

时间:2019-12-17 04:08:50

标签: go protocol-buffers grpc

我有2个grpc服务(service1service2)彼此交互,在某些情况下,service1的rpc响应将由{{1}中定义的结构组成},在经历了不可避免的重复的几种情况之后,我发现随着服务的增长,这些服务将变得难以管理,因此我现在将原始文件重组为类似这样的文件

service2

. ├── app ... ├── proto │   ├── service1 │   │   ├── service1.access.proto │   │   ├── service1.proto │ ├── service2 │ │   ├── service2.access.proto │ │   └── service2.proto │   └── model │   ├── model.service1.proto │   └── model.service2.proto └── proto-gen // the protoc generated files    ├── service1    │   ├── service1.access.pb.go    │   └── service1.pb.go ├── service2 │   ├── service2.access.pb.go │   └── service2.pb.go    └── model    ├── model.service1.pb.go    └── model.service2.pb.go 需要在service1上导入模型定义,所以我要这样导入

model/model.service2.proto

然后我使用此import "model/model.service2.proto"; option go_package = "proto-gen/service1"; 命令生成.pb.go文件

protoc

该命令可以很好地生成ls proto | awk '{print "protoc --proto_path=proto proto/"$1"/*.proto --go_out=plugins=grpc:."}' | sh 文件,但是.pb.go上的代码似乎无法正确导入模型,并且我不知道它是否相关,但是我何时运行该应用程序,它将引发此错误

service1.access.pb.go

我花了几个小时仔细研究如何正确导入另一个原型文件,我似乎找不到任何解决方法

2 个答案:

答案 0 :(得分:0)

之所以出现关于model的错误,是因为生成的文件使用了导入文件的go_package,而model不是有效的导入路径。您必须说服生成的文件以使用包的完整导入路径。

这就是我为源代码树所做的工作:我有一棵相似的原始文件树,它们相互导入。如果您的模块被命名为github.com/myapp,然后使用protoc运行--proto-path=<directory containing github.com>,使用完整路径导入其他原型文件,即github.com/myapp/proto/service1/service1.proto,并在service1.proto中定义go_package = service1。在我的情况下,此设置可以正确写入导入路径。

在开始使用此解决方案之前,我使用的是go_package=<full path to proto>,因此您也可以尝试一下。

答案 1 :(得分:0)

以Burak Serdar为基础,我想提供实现。

将软件包设置为要导入的原始文件,类似于此处的位置为完整路径的地方。我的路径通常是github.com/AllenKaplan/[project]/[package]/proto/

option go_package = [path];

在要导入的文件中添加导入。我的路径通常是[package]/proto/[package].proto

import = [path from protoc proto path]

最后一部分是protoc命令,其中您必须以连接导入路径和选项go_package路径的方式定义protopath

如果从github.com/AllenKaplan/[project]目录执行,我会打电话

protoc -I. --go_out=./[package]/proto [package]/proto/[package].proto

-I. === --proto_path.

-I.将原型路径设置为整个项目


请注意,在要导入的protoc文件上调用.proto时,您需要向输出中添加source_relative:,以确保输出是从根目录开始的包。

github.com/AllenKaplan/[project]/[package]调用时我对导入协议的实现

protoc -I./proto --go_out=paths=source_relative:./proto [package].proto