package xxx is not in GOROOT——go mod踩坑实录

最近在学习go语言包管理工具时遇到的问题。

问题的描述是在go文件中引入的包在GOROOT中不存在。那这里就牵扯到一个问题,你的包管理工具使用的是哪一种?

GOPATH 或者 Go mod

早期go版本的包管理工具是使用GOPATH来进行包的管理,然而在Go1.11版本之后,Go module开始用于替代GOPATH的包管理方式。Go module 是 Go1.11 版本发布的依赖管理方案,从 Go1.14 版本开始推荐在生产环境使用,于Go1.16版本默认开启。

这两种方式在go日常的开发中都得以保留。那怎么知道我们使用的是哪种包管理方式呢?

1.在终端(cmd)中输入

$ go env

会显示出与go相关的环境变量,比如我的

GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/yinwenjie/Library/Caches/go-build"
GOENV="/Users/yinwenjie/Library/Application Support/go/env"
GOEXE=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/yinwenjie/Documents/project/goproject/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/yinwenjie/Documents/project/goproject"
GOPRIVATE=""
GOPROXY="https://goproxy.cn,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.16.9"
GCCGO="gccgo"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/Users/yinwenjie/Documents/project/goModProject/packageTest/go.mod"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/96/tk6h_bnd0ydd93xb0ntzn7s80000gn/T/go-build2298977271=/tmp/go-build -gno-record-gcc-switches -fno-common"

 2.查看GO111MODULE变量的值

该变量的值有三种,分别为"on","off"和"auto"

GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。

GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。

GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:

当前目录在GOPATH/src之外且该目录包含go.mod文件

当前文件在包含go.mod文件的目录下面。

3.查看当前文件所处的位置

由于我是将go mod的配置打开了的,因此在默认情况下是会使用go mod的管理方式。而打开的情况下很重要的一点,当前文件不能在GOPATH的src路径之下。这样go会默认使用GOPATH来进行包的管理,go mod 相关的配置就不起作用了,进而就无法进行go mod模块化的管理。

解决方式:

很简单,将相关联的go文件移除GOPATH的src路径下即可,go文件便能正常编译执行。

参考:Go go.mod入门 - 知乎

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值