说明
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 | on 所有的构建,都使用Module机制 |
和dep区别
1 | dep是解析所有的包引用,然后在$GOPATH/pkg/dep下进行缓存,再在项目下生成vendor,然后基于vendor来构建项目,无法脱离GOPATH,因为vendor必须在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 | // 如果old里的@v缺省的话,那就代表所有版本,如果new里的@v缺省的话,就表示使用的是本地引用,应该使用本地绝对路径来表示 |
例:
1 | go mod edit -replace=gitlab.com/group/project=/home/user/workspace/group/project |
引用:
https://www.cnblogs.com/apocelipes/archive/2018/08/25/9534885.html
https://blog.vgmdj.cn/post/go语言学习-module机制/