Golang构建时遇到vendor依赖问题如何解决
Golang构建时遇到vendor依赖问题如何解决 我想在我的项目中使用 parquet-go 库(https://github.com/xitongsys/parquet-go),但在构建项目时遇到了问题。以下是重现问题的步骤:
- 创建一个名为 temp 的新项目,并将以下代码写入 main.go
package main
import (
"github.com/xitongsys/parquet-go/ParquetFile"
"github.com/xitongsys/parquet-go/ParquetWriter"
)
type Model struct {
F1 string `parquet:"name=name, type=UTF8"`
}
func main() {
// Write
fw, _ := ParquetFile.NewLocalFileWriter("/tmp/test.parquet")
pw, _ := ParquetWriter.NewParquetWriter(fw, new(Model), 4)
stu := Model{F1: "f1"}
pw.Write(stu)
fw.Close()
}
代码结构应该是:
$GOPATH/src
|-- temp
|-- main.go
- 使用 “go get github.com/xitongsys/parquet-go/…” 下载所需的库。完成后,代码结构应该是:
$GOPATH/src
|-- cloud.google.com
|-- github.com
|-- go.opencensus.io
|-- golang.org
|-- google.golang.org
|-- gopkg.in
|-- temp
|-- main.go
-
使用 “go build” 构建项目。这不会有问题。
-
将所有依赖项复制到 “vendor” 目录:
$GOPATH/src
|-- cloud.google.com
|-- github.com
|-- go.opencensus.io
|-- golang.org
|-- google.golang.org
|-- gopkg.in
|-- temp
|-- main.go
|-- vendor
|-- cloud.google.com
|-- github.com
|-- go.opencensus.io
|-- golang.org
|-- google.golang.org
|-- gopkg.in
然后运行 “go build”,但失败了,错误如下:
$ go build
vendor/github.com/colinmarc/hdfs/client.go:14:2: use of internal package github.com/colinmarc/hdfs/internal/protocol/hadoop_hdfs not allowed
vendor/github.com/colinmarc/hdfs/client.go:15:2: use of internal package github.com/colinmarc/hdfs/internal/rpc not allowed
- 然后我删除 $GOPATH/src 下的所有依赖项:
$GOPATH/src
|-- temp
|-- main.go
|-- vendor
|-- cloud.google.com
|-- github.com
|-- go.opencensus.io
|-- golang.org
|-- google.golang.org
|-- gopkg.in
然后运行 “go build”,但也失败了,出现不同的错误:
$ go build
vendor/github.com/colinmarc/hdfs/client.go:13:2: cannot find package "github.com/colinmarc/hdfs/v2/hadoopconf" in any of:
/Users/jrliu/Projects/go_temp/src/temp/vendor/github.com/colinmarc/hdfs/v2/hadoopconf (vendor tree)
/usr/local/go/src/github.com/colinmarc/hdfs/v2/hadoopconf (from $GOROOT)
/Users/jrliu/Projects/go_temp/src/github.com/colinmarc/hdfs/v2/hadoopconf (from $GOPATH)
vendor/github.com/colinmarc/hdfs/client.go:14:2: cannot find package "github.com/colinmarc/hdfs/v2/internal/protocol/hadoop_hdfs" in any of:
/Users/jrliu/Projects/go_temp/src/temp/vendor/github.com/colinmarc/hdfs/v2/internal/protocol/hadoop_hdfs (vendor tree)
/usr/local/go/src/github.com/colinmarc/hdfs/v2/internal/protocol/hadoop_hdfs (from $GOROOT)
/Users/jrliu/Projects/go_temp/src/github.com/colinmarc/hdfs/v2/internal/protocol/hadoop_hdfs (from $GOPATH)
vendor/github.com/colinmarc/hdfs/client.go:15:2: cannot find package "github.com/colinmarc/hdfs/v2/internal/rpc" in any of:
/Users/jrliu/Projects/go_temp/src/temp/vendor/github.com/colinmarc/hdfs/v2/internal/rpc (vendor tree)
/usr/local/go/src/github.com/colinmarc/hdfs/v2/internal/rpc (from $GOROOT)
/Users/jrliu/Projects/go_temp/src/github.com/colinmarc/hdfs/v2/internal/rpc (from $GOPATH)
有人能帮我找出问题所在吗?我将非常感激!
$ go version
go version go1.12 darwin/amd64
更多关于Golang构建时遇到vendor依赖问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于Golang构建时遇到vendor依赖问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
这个问题是由于Go的vendor机制与内部包(internal package)的访问限制导致的。github.com/colinmarc/hdfs包中的代码试图导入其内部的internal包,但vendor目录的结构破坏了正常的导入路径。
当使用vendor时,Go工具链会检查内部包的导入路径。内部包只能被同父目录下的其他包导入,但vendor目录改变了包的相对位置,导致访问被拒绝。
解决方案是使用Go模块(Go modules)来管理依赖,而不是手动复制vendor目录。以下是具体步骤:
- 在项目根目录初始化Go模块:
cd /path/to/your/project
go mod init temp
- 使用go mod tidy自动下载和管理依赖:
go mod tidy
- 构建项目:
go build
如果仍然需要vendor目录,可以使用Go模块的vendor命令:
go mod vendor
这会创建正确的vendor目录结构,保持内部包的相对路径完整性。
示例的go.mod文件可能如下:
module temp
go 1.12
require (
github.com/xitongsys/parquet-go v0.0.0-20210722061312-b6fee75f783c
// 其他依赖会自动解析
)
对于你当前的Go 1.12版本,需要设置环境变量启用Go模块:
export GO111MODULE=on
使用Go模块后,依赖管理会自动处理内部包的访问权限问题,避免手动复制vendor目录导致的路径错误。

