go modules使用

go modules机制

go modules是golang在1.11版本中作为实验性功能加入,并在1.12版本中将go modules纳入正式支持。go modules是一个新型的go包管理工具,用于解决go程序的包依赖问题。

在go modules出现之前,go程序的第三方包依赖管理一直是个头疼的问题,曾经出现过的包管理工具有govendor、dep、glide、godep等,这些包管理工具都是基于GOPATH或者vendor目录,并不能很好的解决不同版本依赖问题。go modules是在GOPATH之外一套新的包管理方式。

模块是相关Go包的集合。modules是源代码交换和版本控制的单元。 go命令直接支持使用modules,包括记录和解析对其他模块的依赖性。modules替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件。

go.mod和go.sum

go modules的使用首先得创建go.mod文件,go.mod文件初始化命令如下:

#在项目根目录下执行
go mod init

go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,比如go get、go build、go mod等修改和维护go.mod文件。

go.mod文件主要包括3部分,分别描述了当前项目的名称,使用的go版本号和依赖的第三方包,文件内容如下格式:

module helloworld

go 1.12

require (
    github.com/labstack/echo v3.3.10+incompatible
    github.com/labstack/gommon v0.2.8
    github.com/mattn/go-colorable v0.1.1
    github.com/mattn/go-isatty v0.0.7
    github.com/valyala/fasttemplate v1.0.0
    golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a
)

go module安装package的原则是先拉最新的release tag,若无tag则拉最新的commit,详见Modules官方介绍。 go module会自动生成一个go.sum文件来记录所以的依赖内容,如下格式:

github.com/labstack/echo v3.3.10+incompatible h1:pGRcYk231ExFAyoAjAfD85kQzRJCRI8bbnE7CX5OEgg=
github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s=
github.com/labstack/gommon v0.2.8 h1:JvRqmeZcfrHC5u6uVleB4NxxNbzx6gpbJiQknDbKQu0=
github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4=
github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
...

go module安装的package依赖文件并不是下载到$GOPATH中,而是$GOPATH/pkg/mod中,多个项目可以共享缓存的module。

go mod 命令

go mod可使用的命令如下:

命令 说明
download download modules to local cache(下载依赖包)
edit edit go.mod from tools or scripts(编辑go.mod)
graph print module requirement graph (打印模块依赖图)
init initialize new module in current directory(在当前目录初始化mod)
tidy add missing and remove unused modules(拉取缺少的模块,移除不用的模块)
vendor make vendored copy of dependencies(将依赖复制到vendor下)
verify verify dependencies have expected content (验证依赖是否正确)
why explain why packages or modules are needed(解释为什么需要依赖)

go.mod文件提供了module, require、replace和exclude四个命令来描述项目的包依赖关系

命令 说明
module 语句指定包的名字(路径)
require 语句指定的依赖项模块
replace 语句可以替换依赖项模块
exclude 语句可以忽略依赖项模块

参考资料

分类

开发
    --go (9)
    --java (5)
    --php (11)
    --mysql (9)
    --javascript (3)
    --html (1)
    --算法 (6)
架构
    --理论 (9)
    --网络 (3)
    --服务器 (2)
    --消息队列 (3)
    --容器 (5)
    --监控 (1)
    --搜索引擎 (3)
    --大数据 (0)
    --测试 (1)
系统
    --linux (10)
    --mac (2)
    --windows (1)
足球
    --世界杯 (60)
    --欧洲杯 (28)
    --文迷 (3)
大学时光
    --校园生活 (96)
    --假期生活 (17)
    --广院杯那些事 (14)
    --北京奥运 (6)
    --胡思乱写 (17)


最近发布

零拷贝技术介绍

服务网格技术简介

C语言标准和标准库简介

Kubernetes简介及环境搭建

Go语言开发的顶级项目


归档

2006 (109)
2007 (40)
2008 (47)
2009 (10)
2010 (6)
2012 (10)
2013 (14)
2014 (27)
2015 (15)
2016 (6)
2017 (8)
2018 (11)
2019 (17)
2020 (5)