关于 Go mod 的介绍

版本号的说明

  • 版本号由三个部分组成: 主版本.副版本.修订号
  • 修订号的增加表示修复了一些BUG
  • 副版本号的增加表示修改了一些内部实现的逻辑,但是对外提供的接口没有改变
  • 主版本号的增加表示修改了对外提供的接口,主版本之间是可以不兼容的

Go mod 版本管理

  • 注意: 使用 go mod 进行管理的仓库必须放置在GOPATH
  • Go mod 通过 Git 的标签来标记版本 git tag v1.0.0 && git push --tags
  • 建议为每个主版本新建一个分支(git checkout -b v1)
  • go mod init reponame可以创建一个库
  • go build命令会自动分析代码中的依赖,并获取相应版本的库
  • go get -u将会升级依赖的副版本号或者修订号
  • go get -u=patch将会升级修订号,但是不会升级副版本号
  • go get package@version表示安装特定版本的的依赖
  • Go会将依赖写在仓库下的go.modgo.sum文件中

主版本升级

  • 当仓库的主版本发生变化时,其导入路径也应该随之改变,具体就是将go.mod中的github.com/user/repo改成github.com/user/repo/v2

在Golang中,一个依赖可以同时存在两个主版本不同的import

1
2
3
4
import (
    "github.com/user/repo"
    repov2 "github.com/user/repo/v2"
)

故当一个仓库需要升级某个依赖的主版本时,其代码导入路径要随之改变。如果依赖的API变了,那么仓库也要进行相应的更改。

清除依赖

go mod tidy命令可以移除go.mod中不再使用的依赖

Go mod 和 Vendoring

  • Go 1.12 支持使用go mod verdor命令将依赖安装在仓库的vendor目录下
  • go build命令会忽略掉vendor目录,go build -mod vendor命令会从当前目录的vendor目录下寻找依赖

其他说明

Go 将依赖安装在GOPATH/pkg/mod中,并且依赖的每个版本会分开安装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
>>> tree $GOPATH/pkg/mod/github.com/bwangelme/                         08:42:57 (10-11)
/Users/michaeltsui/go/pkg/mod/github.com/bwangelme/
├── testmod
│   └── v2@v2.0.0
│       ├── README.md
│       ├── go.mod
│       └── testmod.go
├── testmod@v1.0.0
│   ├── README.md
│   ├── go.mod
│   └── testmod.go
└── testmod@v1.0.1
    ├── README.md
    ├── go.mod
    └── testmod.go