一. 发展历史
GOPATH时代
:所有代码都放到GOPATH下,对于没有任何外部依赖管理(淘汰)Vendor时代
:vendor目录下的包会被优先使用,但没有版本号等信息管理(淘汰)Module时代
:通过go.mod
配置文件,管理版本信息,依赖包目录等(推荐)- 包管理趋势:
支持锁定版本
,支持server
,本地多版本缓存
(优化性能)
二. Vendor机制
项目目录下,如果有vender目录,会优先加载vender目录下的依赖包。
$ go get github.com/tools/godep
godep命令:
$ godep save #将依赖项输出并复制到Godeps.json文件中
$ godep go #使用保存的依赖项运行go工具
$ godep get #下载并安装具有指定依赖项的包
$ godep path #打印依赖的GOPATH路径
$ godep restore #在GOPATH中拉取依赖的版本
$ godep update #更新选定的包或go版本
$ godep diff #显示当前和以前保存的依赖项集之间的差异
$ godep version #查看版本信息
在项目目录下执行
godep save
命令,会在当前项目中创建Godeps
和vender
两个文件夹。
三. GoMod机制
- Go1.11中推荐用
go module
模块化编程的方式,管理源代码交换 ( interchange ) 和版本化控制
。 - 模块可以包含其他模块,在这种情况下,它们的内容将从父模块中排除。
go module
可以在任何目录下,而不再强调项目必须在GOPATH
目录下。
1.开启module: 新版本中默认已是开启状态
$ echo $GO111MODULE #查看状态
$ export GO111MODULE=on #开启mod
2.设置代理: 参考 GOPROXY 官网
$ export GOPROXY=https://goproxy.io/
或者,可以把上面的命令写到 .bashrc 或 .bash_profile 文件当中。
3.gomod命令:
$ go mod download #下载依赖的module到本地cache。“go env”查看GOCACHE,“go clean -cache”清理缓存
$ go mod edit #编辑go.mod文件
$ go mod graph #打印模块依赖图
$ go mod init #初始化当前文件夹, 创建go.mod文件
$ go mod tidy #增加缺少的module,删除无用的module
$ go mod vendor #将依赖复制到vendor下
$ go mod verify #校验依赖
$ go mod why #解释为什么需要依赖
4.初始化mod:
- 在
非GOPATH
目录下创建案例项目,执行初始化命令,即可生成go.mod
文件 - 执行
go get
、go build
或go run
命令,会自动下载依赖包并生成go.sum
文件(哈希摘要校验)
[root@mypro] $ go mod init github.com/xxx/mypro
go: creating new go.mod: module mypro
go: copying requirements from Godeps/Godeps.json
[root@mypro] $ go get #下载依赖项,生成go.sum
5.配置依赖项:
- 包含
包名
、Go版本
、依赖项
、替换项
、排除项
、配置注解
。
module github.com/xxx/mypro
go 1.12
//依赖项
require (
github.com/lunny/log v0.0.0-20160921050905-7887c61bf0de
github.com/pkg/errors v0.0.0-20190227000051-27936f6d90f9
)
//替换项
replace golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
//排除项目
exclude old/thing v1.2.3
6.常用命令:
$ go mod edit -fmt #格式化
$ go mod edit -require=golang.org/x/text #添加依赖项
$ go mod edit -droprequire=golang.org/x/text #移除依赖项
四. GoMod示例
1.创建项目:
$ mkdir ~/mypro && cd ~/mypro && touch main.go #非GOPATH目录
2.编辑示例代码:main.go
package main
import "github.com/sirupsen/logrus" //测试依赖包
func main() {
logrus.Info("mod test ok")
}
3.初始化mod:
$ go mod init github.com/xxx/mypro
4.测试运行
$ go run main.go
此时,项目在不依赖GOPATH的情况下,由
go mod
完成了项目的依赖管理。