使用proto buff(.proto文件)自动生成代码时导入错误的包

问题描述 投票:0回答:1

所以我正在开发一个使用 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
xcode go backend protocol-buffers auto-generate
1个回答
0
投票

我开始写这篇文章后你添加了你的评论。

我不使用

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
© www.soinside.com 2019 - 2024. All rights reserved.