go module是go1.11之后,官方推荐的包管理工具,将会在1.13发布之后,成为默认的包管理工具。

开启go module

首先要将GO111MODULE设置为on

  1. // 打开配置文件
  2. vim ~/.bash_profile
  3. // 导出GO111MODULE=on
  4. export GO111MODULE=on
  5. // 众所周知的原因,挂个代理
  6. export GOPROXY=https://goproxy.io
  7. // 执行配置文件
  8. source ~/.bash_profile

既有项目

  1. cd gin-blog
  2. //在这个文件夹下创建一个空的go.mod
  3. go mod init
  4. //查找依赖,并记录在go.mod文件中
  5. go get ./...

简单的两行命令,即可完成老项目向go module转变。
进过上面两步之后,会发现项目根目录下多了两个文件,go.mod go.sum

  1. go.mod
  2. // 表明归属的项目
  3. module gin-blog
  4. // go的版本
  5. go 1.12
  6. // 依赖的包
  7. require (
  8. github.com/Unknwon/com v0.0.0-20190321035513-0fed4efef755
  9. github.com/astaxie/beego v1.12.0
  10. github.com/dgrijalva/jwt-go v3.2.0+incompatible
  11. github.com/gin-gonic/gin v1.4.0
  12. github.com/go-ini/ini v1.44.0
  13. github.com/jinzhu/gorm v1.9.10
  14. )
  1. go.sum
  2. //记录每个依赖库的版本和哈希值
  3. cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
  4. cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
  5. cloud.google.com/go v0.37.4/go.mod h1:NHPJ89PdicEuT9hdPXMROBD91xc5uRDxsMtSB16k7hw=
  6. github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
  7. github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0=
  8. github.com/OwnLocal/goes v1.0.0/go.mod h1:8rIFjBGTue3lCU0wplczcUgt9Gxgrkkrw7etMIcn8TM=
  9. github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo=
  10. ...

新建的项目

得益于新的go module,可以用在go path下的src新建目录:

  1. cd desktop
  2. mkdir go-module-test
  3. cd go-module-test
  4. // 一定要在init后指定项目名称 否在会报错:
  5. //go: cannot determine module path for source directory /Users/ray/desktop/go-module-test (outside GOPATH, no import comments)
  6. go mod init go-module-test

之后需要下载新的包,可以使用go mod download 下载所有的依赖,但是依赖并不是下载到GOPATH中,而是GOPATH/pkg/mod

go mod 命令

  1. go mod init 初始化当前文件夹, 创建go.mod文件
  2. go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
  3. go mod tidy 增加缺少的module,删除无用的module
  4. go mod edit 编辑go.mod文件
  5. go mod graph 打印模块依赖图
  6. go mod vendor 将依赖复制到vendor
  7. go mod verify 校验依赖
  8. go mod why 解释为什么需要依赖

go get

在项目中执行go get命令可以下载依赖包,并且还可以指定下载的版本。

  1. 运行go get -u将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
  2. 运行go get -u=patch将会升级到最新的修订版本
  3. 运行go get package@version将会升级到指定的版本号version

go mod tidy

我们在代码中删除依赖代码后,相关的依赖库并不会在go.mod文件中自动移除。这种情况下我们可以使用go mod tidy命令更新go.mod中的依赖关系。