所以我正在开发一个使用 proto buff 的项目,我需要使用 .proto 文件生成 golang 代码。 我的问题是,当我生成 golang 代码时,它导入了错误的包。
这就是我的项目结构:-
myproject/
├── protos/
│ ├── models/
│ │ ├── ad.proto
│ │ └── enums.proto
│ └── requests/
│ └── ad_request.proto
“ad_request.proto”文件需要来自“ad.proto”和“enums.proto”文件的一些模型或消息 为此,我导入了这些文件并使用了这样的消息-
syntax = "proto3";
package my_project.requests;
import "models/ad.proto";
import "models/enums.proto";
option go_package = "github.com/name/my_project/protos/requests;requests";
现在生成代码后,会生成一个 go 文件 - “ad_requests.pb.go”
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.28.1
// protoc (unknown)
// source: requests/ad_request.proto
package requests
import (
models "github.com/name/my_project/protos/models"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)
不是导入
github.com/name/my_project/models
而是从proto文件夹导入文件,但proto文件夹中没有golang文件
谁知道如何解决这个问题
这是有关 ad.proto 的一些信息
syntax = "proto3";
package my_project.models;
import "google/protobuf/timestamp.proto";
import "models/enums.proto";
option go_package = "github.com/name/my_project/protos/models;models";
这是我用来自动生成代码的make命令
.PHONY: gen proto-gen
gen proto-gen:
buf generate protos --template protos/buf.gen.yaml
protoc-go-inject-tag -input=./internal/models/*.pb.go -remove_tag_comment
protoc-go-inject-tag -input=./internal/requests/*.pb.go -remove_tag_comment
我开始写这篇文章后你添加了你的评论。
我不使用
buf
,所以很抱歉这是纯粹的protoc
。
我假设您想要生成 Go 源代码以及原型。
Protocol Buffers
package
层次结构不会直接转换为 Golang 模块层次结构。您使用 option go_package
的方法是正确的,但我建议不要使用例如...models;models"
这是我生成原型的方法。我使用对我有用的
--go_opt=module=${MODULE}
方法。还有其他方法可以实现这一目标。
在此方法中,
${MODULE}
必须与您的options go_package={MODULE}/protos/...
的前缀(如您所拥有的)匹配
要么:
MODULE="github.com/name/my_project"
protoc \
--proto_path=${PWD}/protos \
--go_out=${PWD} \
--go_opt=module=${MODULE} \
${PWD}/protos/requests/ad_requests.proto \
${PWD}/protos/models/ad.proto
${PWD}/protos/models/enums.proto