Golang中vendor目录包含包导致构建失败的问题

Golang中vendor目录包含包导致构建失败的问题 我在 macOS High Sierra 10.13.6 上运行 Go 1.11。当我在项目的 vendor 目录中安装包时,go build 的路径似乎会损坏。

我还在 Go 1.7、1.8、1.9 和 1.10 上测试过这个问题。

$ go env
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/gregorysims/Library/Caches/go-build"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOOS="darwin"
GOPATH="/Users/gregorysims/go"
GOPROXY=""
GORACE=""
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GCCGO="gccgo"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/tb/6c5vksm558q5q4t0fxfscgy80000gp/T/go-build368914193=/tmp/go-build -gno-record-gcc-switches -fno-common"

重现步骤:

  1. 拥有一个带依赖项的项目

  2. 运行 go build

得到输出:

$ go build -o out main.go
main.go:6:2: cannot find package "github.com/gorilla/mux" in any of:
	/usr/local/go/src/github.com/gorilla/mux (from $GOROOT)
	/Users/gregorysims/go/src/github.com/gorilla/mux (from $GOPATH)

符合预期

  1. 使用 mkdir vendor 创建 vendor 文件夹

  2. 运行 go build

得到输出:

main.go:6:2: cannot find package "github.com/gorilla/mux" in any of:
	/Users/gregorysims/go/src/github.com/briggybros/gotest/vendor/github.com/gorilla/mux (vendor tree)
	/usr/local/go/src/github.com/gorilla/mux (from $GOROOT)
	/Users/gregorysims/go/src/github.com/gorilla/mux (from $GOPATH)

符合预期

  1. 运行 go get github.com/gorilla/muxdep ensure -add github.com/gorilla/mux

  2. 如果使用了 go get,将 $GOPATH/src/github.com/gorilla/mux 移动到 $GOPATH/src/github.com/briggybros/gotest/vendor/github.com/gorilla/mux

  3. 运行 go build

得到输出:

main.go:6:2: cannot find package "_/Users/gregorysims/go/src/github.com/briggybros/gotest/vendor/github.com/gorilla/mux" in any of:
	/usr/local/go/src/_/Users/gregorysims/go/src/github.com/briggybros/gotest/vendor/github.com/gorilla/mux (from $GOROOT)
	/Users/gregorysims/go/src/_/Users/gregorysims/go/src/github.com/briggybros/gotest/vendor/github.com/gorilla/mux (from $GOPATH)

为什么包的存在会改变 Go 查找它的位置?


更多关于Golang中vendor目录包含包导致构建失败的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

3 回复

是的,原帖中只是有个拼写错误。

更多关于Golang中vendor目录包含包导致构建失败的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


[!quote] Briggybros $GOPATH/src/github.com/briggybros/gotest/vendor/gorilla/mux

不太确定,也无法测试,但这里不应该是 …/vendor/github.com/gorilla/mux 吗?

这个问题是由于Go 1.11的vendor机制与包路径解析方式导致的。当vendor目录存在时,Go工具链会优先在vendor目录中查找依赖包,但如果包路径解析不正确,就会出现构建失败。

在你的情况下,问题出现在第7步之后,Go工具链尝试查找的包路径变成了绝对路径格式 "_/Users/gregorysims/go/src/github.com/briggybros/gotest/vendor/github.com/gorilla/mux",这通常表明包的导入路径或vendor目录结构有问题。

正确的vendor目录结构应该是:

project/
├── main.go
├── vendor/
│   └── github.com/
│       └── gorilla/
│           └── mux/
│               ├── mux.go
│               ├── regexp.go
│               └── ... (其他mux包文件)

检查你的vendor目录结构是否正确。如果使用go get手动获取包,应该使用以下命令:

# 在项目根目录执行
go mod init your-project-name
go get github.com/gorilla/mux

或者如果你坚持使用vendor目录:

# 启用Go modules
export GO111MODULE=on
go mod init
go mod vendor

这样会自动创建正确的vendor目录结构。

如果你必须手动操作,确保vendor目录中的包保持其完整的导入路径结构:

# 在项目根目录执行
mkdir -p vendor/github.com/gorilla
cp -r $GOPATH/src/github.com/gorilla/mux vendor/github.com/gorilla/

在你的main.go中,导入语句应该保持标准格式:

package main

import (
    "github.com/gorilla/mux"
    // 其他导入
)

问题很可能出现在第6步手动移动包时,可能破坏了包的目录结构或导致了路径解析异常。使用Go modules的vendor命令可以避免这种问题。

回到顶部