如何解决由protobuf生成的Go中的外部包依赖关系?



我遵循关于为Golang创建和使用协议缓冲区和gRPC的指南。我已经在输出目录中生成了Go文件,但是我面临着一些问题:

所有3个文件中的导入都是这样开始的:

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
//  protoc-gen-go v1.25.0
//  protoc        v3.15.5
// source: building.proto
package location
import (
proto "github.com/golang/protobuf/proto"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
)

现在,当我尝试构建或运行我的主。Go文件,它只是导入缓冲区并使用它们生成一条消息(甚至没有通过导入阶段),发生以下情况:

..protooutloclocationbuilding.pb.go:10:2: cannot find package
..protooutloclocationbuilding.pb.go:11:2: cannot find package
..protooutloclocationbuilding.pb.go:12:2: cannot find package

这些行引用了前面代码片段中的前3个导入。

我似乎不明白为什么会发生这种事。下面我将描述我为解决这个问题所采取的步骤:
  1. 重新安装protoc和protoc-gen-go编译器(在本地用户目录和系统目录中多次)
  2. 因为我在Windows上,我尝试了几个选项来生成Protobuffers和构建/运行go源代码:使用Goland, CMD, Cygwin (MinGW), Powershell。
  3. 我已经尝试编辑第一次导入使用google.golang.org/protobuf/proto而不是github导入,因为它是从我在网上阅读的弃用。
  4. 我为每个缺失的导入做了一个go get google.golang.org/protobuf/xxxx。它们进入了$GOROOT/pkg/mod而不是$GOROOT/src,我无法接触到它们,所以我手动将它们移动到src。然后我编辑了自动生成的。go文件,看起来像:
    proto "protobuf/proto"
    protoreflect "protobuf/reflect/protoreflect"
    protoimpl "protobuf/runtime/protoimpl"
    
    这确实奏效了……虽然这些文件中的所有导入也从google.golang.org读取,所以…我现在有大约50个导入错误…另外,我真的不想每次重建生成的protobuf文件时都要编辑它们。
  5. 我尝试解决依赖使用go mod init protobuf_example在我的根目录,然后我尝试go mod tidy看起来像它做了"东西"(这里有一个片段):
    go: found google.golang.org/protobuf/encoding/protowire in google.golang.org/protobuf v1.25.0
    go: found google.golang.org/protobuf/internal/encoding/messageset in google.golang.org/protobuf v1.25.0
    go: found google.golang.org/protobuf/internal/errors in google.golang.org/protobuf v1.25.0
    go: found google.golang.org/protobuf/internal/fieldsort in google.golang.org/protobuf v1.25.0
    go: found google.golang.org/protobuf/internal/flags in google.golang.org/protobuf v1.25.0
    go: found google.golang.org/protobuf/internal/genid in google.golang.org/protobuf v1.25.0
    

但最终它没有解决任何问题。我现在试一试。mod文件包含require(*repos*),当我在Goland中悬停在它们上面时,它只是说'unresolved dependency'

我对Go和它神秘的包管理系统很陌生。对于Python和Pip来说,这是相当令人头疼的。

编辑

根据要求,我添加了一些额外的信息:

我走。国防部是:

module protobuf_prac
go 1.16
require (
github.com/golang/protobuf v1.4.3
github.com/google/go-cmp v0.5.5 // indirect
google.golang.org/protobuf v1.25.0
)

我将导入更改为非相对的,并使用正确的模块:

package main
import (
"fmt"
"protobuf_prac/proto/out/loc/location"
)
func main() {
city := location.City{Name: "Sofia", ZipCode: "1000", CountryName: "Bulgaria"}
fmt.Println(city.String())
}

问题仍然存在。

正如@s0xzwasd所提到的,这个问题是在Goland中禁用Go模块。

相关内容

  • 没有找到相关文章