go module 基本使用

go版本在1.13之前,一直以来依赖管理令人诟病,现在官方也有了明确的方向,所以 对go mod 做一个大致的了解

go版本为1.13及以上

官方文档

https://github.com/golang/go/wiki/Modules

go module介绍

go module1.13版本之后go官方自带的go依赖管理库,go module可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod (里面写入了依赖的版本等)文件,使用go module之后代码就可以不放置在src下了

具体的请往下看

开启go module

go在1.13及之后的版本默认是auto,但开不开启MODULE,要看根目录下有没有go.mod文件

也可以设置为 on(全部开启)/off(全部不开启)
Windows: set GO111MODULE=on
Linux/Mac:export GO111MODULE=on

然后输入go env来检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
>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 PROXY代理

go module 是用来依赖管理的,所以使用 go module 时可以不使用 go get 命令( 如果要指定包的版本或者更新包可以使用go get,平时没有必要使用)
设置代理 https://github.com/goproxy/goproxy.cn/blob/master/README.zh-CN.md

初始化

项目第一次使用 GO MODULE(此时项目中还没有go.mod文件)
进入你的项目文件夹

cd xxx/xxx/demo/

初始化 MODULE

go mod init demo(demo为项目名)

然后在项目根目录就会出现一个 go.mod 文件

注意,此时的 go.mod 文件只标识了项目名和go的版本,这是正常的,因为只进行了初始化

检测依赖

go mod tidy

该命令会检测该文件夹目录下所有引入的依赖,并把依赖写入 go.mod 文件,写入后就会发现 go.mod 文件有所变动

例如:此时还没有下载依赖

1
2
3
4
5
6
7
8
9
10
module ledo/library

go 1.13

require (
    github.com/bilibili/kratos v0.3.3
    github.com/dgrijalva/jwt-go v3.2.0+incompatible
    github.com/jinzhu/gorm v1.9.12
    github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726
)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
module demo

go 1.13

require (
    github.com/bilibili/kratos v0.3.3
    github.com/gogo/protobuf v1.3.0
    github.com/golang/protobuf v1.3.5
    github.com/google/go-cmp v0.3.1 // indirect
    github.com/google/wire v0.4.0
    github.com/jinzhu/gorm v1.9.12
    github.com/tealeg/xlsx v1.0.5
    golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553 // indirect
    golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 // indirect
    google.golang.org/appengine v1.6.2 // indirect
    google.golang.org/genproto v0.0.0-20200312145019-da6875a35672
    google.golang.org/grpc v1.27.0
    gopkg.in/yaml.v2 v2.2.7 // indirect
    ledo/library v0.0.0-incompatible
)

下载依赖

我们需要把依赖下载至本地,但不是使用 go get

go mod download

注:如果GOPROXY没有设置好或设置的镜像不好导致速度太慢,有可能就下载不动

下面这一步可忽略:

下面这一步在项目文件夹中生成vendor(放项目依赖的所有包)文件夹后,在把项目文件夹放到没有依赖包的新环境中时,也可以直接运行

执行完成后会将依赖全部下载到 GOPATH 下,会在根目录下生成 go.sum 文件, 该文件是依赖的详细依赖,
但我们的项目文件夹并没有放到 GOPATH 下,那下载至到 GOPATH 下的依赖是没有用的,也就找不到这些包,就没法用

导入依赖

go mod vendor

执行此命令,会将刚才下载到 GOPATH 下的依赖转移到该项目根目录下的 vendor(自动新建) 文件夹下

此时我们就可以使用这些依赖了

Goland 设置开启 GO MODULE

Goland IDE默认是关闭该功能的,我们需要手动打开。都打上勾,因为我是在系统变量中设置了Proxy,所以这里这里就没有设置。
在这里插入图片描述

更新依赖

是指项目引入了新的包依赖,更新依赖从检测依赖执行即可,不需要初始化,即

go mod tidy -v
go mod verify
go mod download
go mod vendor -v(如果未生成vendor,则不需要执行此命令)

新增依赖

直接在项目中 import 这个包,之后更新依赖即可

在团队开发项目时需要使用 GOMODULE

团队开发时, 在项目管理中,如过使用git并且声称了vendor文件夹,那就需要将 vendor 文件夹放入白名单,否则项目中带上依赖包体积会变得很大。
git设置白名单方式:在git托管的项目根目录新建 .gitignore 文件,设置忽略即可。 go.modgo.sum 不可忽略
团队其他人把项目clone后在本地进行依赖更新即可

GOMODULE常用命令

go mod init # 初始化go.mod
go mod tidy # 更新依赖文件
go mod download # 下载依赖文件
go mod vendor # 将依赖转移至本地的vendor文件
go mod edit # 手动修改依赖文件
go mod graph # 打印依赖图
go mod verify # 校验依赖

依赖库管理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
 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='<https://goproxy.io>'
 // 在当前目录下生成一个go.mod文件
 go mod init
 // 添加缺失的模块以及移除不需要的模块
 go mod tidy -v
 // 检查当前模块的依赖是否全部下载下来,是否下载下来被修改过
 go mod verify
 // 生成vendor文件夹,放置go.mod文件描述的依赖包
 go mod vendor -v
 // 获取依赖库
 go mod download
1
2
3
4
5
6
7
// 翻墙官方依赖库
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"