go mod

说明

1
golang1.5 引入 `vendor` 机制,使用 `dep` 管理依赖。golang1.11 后,如果当前目录里有 `go.mod`,就使用 `go modules`,否则使用旧的 `GOPATH` 和 `vendor` 机制。如果你想直接使用 `modules` 而不需要从 `GOPATH` 过度,那么把环境变量 `GO111MODULE` 设置为 `on`(默认值为 `auto` )。`modules` 和传统的 `GOPATH` 不同,不需要包含例如 `src`,`bin` 这样的子目录,一个源代码目录甚至是空目录都可以作为`module`,只要其中包含有 `go.mod` 文件。

GO111MODULE有三种类型:

1
2
3
on 所有的构建,都使用Module机制
off 所有的构建,都不使用Module机制,而是使用GOPATH和Vendor
auto 在GOPATH下的项目,不使用Module机制,不在GOPATH下的项目使用

和dep区别

1
2
dep是解析所有的包引用,然后在$GOPATH/pkg/dep下进行缓存,再在项目下生成vendor,然后基于vendor来构建项目,无法脱离GOPATH,因为vendor必须在GOPATH下才能使用
mod是解析所有的包引用,然后在$GOPATH/pkg/mod下进行缓存,直接基于缓存包来构建项目,所以可以脱离GOPATH

go mod 的使用

初始化 modules:

1
go mod init [project name] // 例:go mod init gitlab.xxx.com/group/project

tidy 对当前引用的再一次整理,添加缺失,去掉多余,并且将包下载放入cache:

1
go mod tidy

生成 vendor:

1
go mod vendor

编译默认会使用最新的包版本,如果包打过tag,那么就会使用最新的那个tag对应的版本

1
go build

只读模式下任何会导致依赖关系变动的情况都将导致build失败:

1
go build -mod=readonly

检查依赖关系的变动:

1
go build -mod=vendor

本地包引用
还是推荐使用 vendor 的方式,

1
replace golang.org/x/sys => github.com/golang/sys

replace 指令的使用

1
2
3
// 如果old里的@v缺省的话,那就代表所有版本,如果new里的@v缺省的话,就表示使用的是本地引用,应该使用本地绝对路径来表示
go mod edit -replace=old[@v]=new[@v]
go mod edit -dropreplace=old[@v]

例:

1
2
go mod edit -replace=gitlab.com/group/project=/home/user/workspace/group/project
go mod edit -replace=gitlab.com/group/project@master=/home/user/workspace/group/project

引用:
https://www.cnblogs.com/apocelipes/archive/2018/08/25/9534885.html
https://blog.vgmdj.cn/post/go语言学习-module机制/