如何解决 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"
)

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

..\proto\out\loc\location\building.pb.go:10:2: cannot find package
..\proto\out\loc\location\building.pb.go:11:2: cannot find package
..\proto\out\loc\location\building.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。然后我编辑了 protoc 自动生成的 .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
    

但最终它没有解决任何问题。我现在有一个包含 require(*repos*) 的 go.mod 文件,当我在 Goland 中将鼠标悬停在它们上面时,它只是说“未解决的依赖项”

如果我错过了什么,我可以提供更多信息。

我想说我对 Go 及其神秘的包管理系统很陌生。来自 Python 和 Pip,这很头疼..

根据要求进行编辑,我正在添加一些额外信息:

我的 go.mod 是:

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 模块。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...