介绍
Go1.11版本提供Go modules机制对包进行管理,同时保留GOPATH和vendor机制,使用临时环境变量GO111MODULE进行控制,GO111MODULE有三个可选值:
- 当GO111MODULE为off时,构建项目始终在GOPATH和vendor目录搜索目标程序依赖包
- 当GO111MODULE为on时,构建项目则始终使用Go modules机制,在GOPATH/pkg/mod目录搜索目标程序依赖包
- 当GO111MODULE为auto(默认)时,当构建源代码不在GOPATH/src的子目录且包含go.mod文件,则使用Go modules机制,否则使用GOPATH和vendor机制
GOPATH+vendor机制
-
vendor
将项目依赖包拷贝到项目下的vendor目录,在编译时使用项目下vendor目录中的包进行编译
解决问题:
- 依赖外部包过多,在使用第三方包时需要使用go get进行下载
- 第三方包在go get下载后不能保证开发和编译时版本的兼容性
-
包搜索顺序
- 在当前包下的vendor目录查找
- 向上级目录查找,直到GOPATH/src/vendor目录
- 在GOPATH目录查找
- 在GOROOT目录查找
-
第三方包
可以借助go get工具下载和安装第三方包及其依赖,需要安装与第三方包匹配的代码管理工具,比如git、svn等
使用方法:
常用参数:
+ -d:仅下载依赖包
+ -u:更新包并安装
+ -x:打印执行的命令
+ -v:打印构建的包
+ -insecure:允许使用http协议下载包
第三方包查找地址:
+ [https://godoc.org](https://godoc.org)
+ [https://gowalker.org/](https://gowalker.org/)
Go modules机制
-
优势:
- 不用设置GOPATH,代码可任意放置
- 自动下载依赖管理
- 版本控制
- 不允许使用相对导入
- replace机制
-
初始化模块
命令:go mod init modname
-
当前模块下的包
对于当前模块下的包导入时需要使用modname+packagename
-
第三方包
在使用go mod tidy、go build、go test、go list命令会自动将第三方依赖包写入到go.mod文件中同时下载第三方依赖包到GOPATH/pkg/mod/cache目录,并在当前模块目录生成一个构建状态跟踪文件go.sum,文件中记录当前module所有的顶层和间接依赖,以及这些依赖的校验和
-
常用命令
go mod tidy:整理依赖模块(添加新增的,删除未使用的)
go mod vendor: 将依赖模块拷贝到模块中的vendor目录
go build: 编译当前模块
go build ./...: 编译当前目录下的所有模块
go build -mod=vendor:使用当前模块下的vendor目录中的包进行编译
go mod download: 仅下载第三方模块
go mod grapha: 打印所有第三方模块
go list -m -json all:显示所有模块信息
-
go mod edit: 修改go.mod文件
-require=pakcage@version
-replace=old_package@version=new_package@version
可以使用-replace功能将包替换为本地包,实现相对导入