Go mod 笔记

2,920 阅读2分钟

引入Go mod的好处

  • 自动下载依赖包
  • 不需要将代码再放入$GOPATH/src
  • 所有来自第三方的包都会指定版本(使用dep是无法指定第三方包的版本的)
  • 对于已经转移的包,可以用replace在go.mod文件中替换,不需要修改代码

关于GO111MODULE环境变量说明

他有三个取值

  • off:关闭,不使用gomod
  • on: 打开,使用gomod
  • auto: 对于以下两种case会使用gomod

(1)在$GOPATH/src之外 (2)当前文件在包含go.mod文件的目录下

go mod命令

命令 作用
download 下载依赖包
edit 编辑go.mod
init 在当前目录下初试话gomod
tidy 拉取缺少的模块,删除不用的模块
vendor 将依赖复制到vendor目录下
verify 验证是否正确

go.mod 命令字

命令字 作用
module 指定包的名字(路径)
require 指定依赖项模块
replace 替换依赖项模块
exclude 忽略依赖项模块

使用

  • 使用很简单,在go文件中import依赖的包名,然后go run xxx.go运行代码,go mod会自动查找依赖自动下载
  • 可以使用命令go list -m -u all来检查升级的package,使用go get -u xxx_package@version来升级(version是x.y.z)

go.sum

这个是依据hash来检测下载下来的依赖,是不是和该版本依赖复合

项目升级

原先用vendor的可以在设置GO111MODULE之后切换到gomod模式,但需要注意,以前的本项目包的调用,使用的是对应的go文件相对于那个包的位置,切换到gomod之后,使用的是相对于go.mo的位置,所以有可能需要更新import 路径

关于版本

gomod要求目标库打上符合要求的tag,如果没有打上tag(x.y.z),就要求毫无差错的编写大串版本信息。基于以上原因,现在可以直接使用commit的hash来指定版本,如下:

# 使用go get时
go get github.com/mqu/go-notify@ef6f6f49

# 在go.mod中指定
module my-module

require (
  // other packages
  github.com/mqu/go-notify ef6f6f49
)

使用go build或者go mod tidy之后,go.mod会变成:

module my-module

require (
    github.com/mattn/go-gtk v0.0.0-20181205025739-e9a6766929f6 // indirect
    github.com/mqu/go-notify v0.0.0-20130719194048-ef6f6f49d093
)

参考

再探go modules:使用与细节