github地址 https://github.com/golang/go/wiki/Modules
go版本在1.13及以后使用了官方自带的go依赖管理库go module进行管理。
go module
将某个项目(文件夹)下的需要的依赖包及版本等写入到一个 go.mod
文件,使用go module
之后代码就可以不放置在src下了
开启go module
和设置代理请参考https://blog.csdn.net/fbbqt/article/details/103872568中的代理设置
go module
状态go在1.13及之后的版本默认是auto,默认模式,当前目录在GOPATH/src目录之外而且包含go.mod文件才会启用
设置go module为 on(全部开启)/off(全部不开启)
Windows系统:
set GO111MODULE=on
Linux/Mac系统:export GO111MODULE=on
然后输入go env
来检查
C:\Users\Administrator>go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Administrator\AppData\Local\go-build
set GOENV=C:\Users\Administrator\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=D:\goproject
set GOPRIVATE=
set GOPROXY=https://goproxy.cn/
set GOROOT=D:\gzrjaz\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\gzrjaz\Go\pkg\tool\windows_amd64
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\ADMINI~1\AppData\Local\Temp\go-build199922342=/tmp/go-build -gno-record-gcc-switches
查看 GO111MODULE
选项,为 on
代表修改成功
项目刚开始的时候,项目中还没有go.mod
文件。
进入你的项目文件夹
cd xxx/xxx/demo/
然后执行以下命令:
go mod init demo
(demo为项目名)
然后在项目根目录就会出现一个 go.mod 文件
注意,此时只进行了初始化, go.mod 文件只标识了项目名和go的版本
go mod tidy -v
该命令会根据你的项目检测该文件夹目录下需要引入的依赖,并把依赖写入 go.mod 文件,写入后就会发现 go.mod 文件有所变动
我们需要把依赖下载至本地,但不是使用 go get
go mod download
注:如果GOPROXY没有设置好或设置的镜像不好会导致速度太慢,甚至下载不动
Vendor文件夹可忽略:
在项目文件夹中生成vendor(放项目依赖的所有包)文件夹后,再把项目文件夹放到没有依赖包的新环境中时,也可以直接运行
执行完成后会将依赖全部下载到 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖,
但我们的项目文件夹并没有放到 GOPATH 下,那下载至到 GOPATH 下的依赖是没有用的,也就找不到这些包,就没法用
go mod vendor -v
执行此命令,会将刚才下载到 GOPATH 下的依赖转移到该项目根目录下的 vendor(自动新建) 文件夹下
此时我们就可以使用这些依赖了
Goland IDE默认是关闭该功能的,我们需要手动打开。都打上勾,因为我是在系统变量中设置了Proxy
,所以这里这里就没有设置。
是指项目引入了新的包依赖,更新依赖从检测依赖执行即可,不需要初始化,即
go mod tidy -v
go mod verify
go mod download
go mod vendor -v(如果未生成vendor,则不需要执行此命令)
直接在项目中 import 这个包,之后更新依赖即可
go mod edit
# 手动修改依赖文件
go mod graph
# 打印依赖图
govendor依赖管理
govendor命令
// 创建vendor文件夹和vendor.json文件
govendor init
// 从$GOPATH中添加依赖包,会加到vendor.json
govendor add
// 从vendo文件夹删除依赖
govendor remove
// 从$GOPATH升级依赖包
govendor update
// 列出已经存在的依赖包
govendor list
// 从远端库增加新的,或者更新vendor文件中的依赖包
govendor fetch
// 本地存在vendor.json时候拉取依赖包,匹配所记录的版本
govendor sync
// 列出本地丢失的,过期的和修改的 package
govendor status
// 类似go get,但是会把依赖包拷贝到vendor目录
govendor get
govendor依赖包类型
+local:本地包,及项目自身的包组织 l
+external:外部包,即被$GOPATH管理,但不在vendor目录下 e
+vendor:已被govendor管理,即在vendor目录下 v
+std:标准库中的包 s
+unused:未使用的包,即包在vendor目录下,但项目并没有使用 u
+missing:代码引用了依赖包,但该包并没有找到 m
+program:主程序包,意味着可以编译为执行文件 p
+outside:外部包和缺失的包
+all:所有的包
// 默认模式,当前目录在GOPATH/src目录之外而且包含go.mod文件才会启用
export GO111MODULE=auto
// GOPATH模式,在vendor目录下和GOPATH目录中查找依赖包
export GO111MODULE=off
// module-aware模式,使用modules功能,而不会访问GOPATH,依赖包放在GOPATH/pkg/mod目录下
export GO111MODULE=on
export GOPROXY=''
// 在当前目录下生成一个go.mod文件
go mod init
// 添加缺失的模块以及移除不需要的模块
go mod tidy -v
// 检查当前模块的依赖是否全部下载下来,是否下载下来被修改过
go mod verify
// 生成vendor文件夹,放置go.mod文件描述的依赖包
go mod vendor -v
// 获取依赖库
go mod download
// 修改依赖文件
go mod edit
// 打印依赖图
go mod graph
GOPROXY
go module
是用来依赖管理的,所以使用 go module
时无需使用 go get
命令( 如果要指定包的版本或者更新指定的包可以使用go get)
设置代理参考文档 https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md
// 官方依赖库
export GOPROXY='https://goproxy.io'
// 不微软依赖库
1、export GOPROXY=https://goproxy.cn/
2、export GOPROXY="https://goproxy.cn"
3、export GOPROXY=https://mirrors.aliyun.com/goproxy/
4、export GOPROXY="https://athens.azurefd.net"