如何解决由 protobuf 生成的 Go 中的外部包依赖项?
How can I resolve external package dependencies in Go generated by protobuf?
我正在遵循有关为 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 个导入。
我已经无计可施了,想弄清楚为什么会这样。下面我将描述我为解决此问题所采取的步骤:
- 重新安装 protoc 和 protoc-gen-go 编译器(在本地用户目录和系统目录中多次安装)
- 因为我在 Windows,我尝试了几个选项来生成 Protobuffers 和 building/running go 源代码:使用 Goland、CMD、Cygwin (MinGW)、Powershell。
- 我尝试编辑第一个导入以使用
google.golang.org/protobuf/proto
而不是 github 导入,因为我在网上阅读的内容已弃用它。
- 我为每个丢失的导入做了一个
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 文件每次我重建它们。
- 我尝试在我的根目录中使用
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 中将鼠标悬停在它们上面时,它只显示 'unresolved dependency'
如果我遗漏了什么,我可以提供更多信息。
我想说我对 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 模块。
我正在遵循有关为 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 个导入。
我已经无计可施了,想弄清楚为什么会这样。下面我将描述我为解决此问题所采取的步骤:
- 重新安装 protoc 和 protoc-gen-go 编译器(在本地用户目录和系统目录中多次安装)
- 因为我在 Windows,我尝试了几个选项来生成 Protobuffers 和 building/running go 源代码:使用 Goland、CMD、Cygwin (MinGW)、Powershell。
- 我尝试编辑第一个导入以使用
google.golang.org/protobuf/proto
而不是 github 导入,因为我在网上阅读的内容已弃用它。 - 我为每个丢失的导入做了一个
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 文件每次我重建它们。 - 我尝试在我的根目录中使用
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 中将鼠标悬停在它们上面时,它只显示 'unresolved dependency'
如果我遗漏了什么,我可以提供更多信息。
我想说我对 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 模块。