原理就不赘述,大家留心main.go引入pk1用的

go-mod-test/src/pk1

。注意前面的『“go-mod-test”』这个准确说是当前项目的父Module。在项目路径里通过执行

go mod init go-mod-test

来生成go.mod,即初始化Module,内容就两行,模块名及go版本。

➜  go-mod-test cat go.mod
module go-mod-test

go 1.14

此时我们在main.go加入依赖,如

 _ "github.com/gin-gonic/gin"

然后我们运行

➜  go-mod-test go mod tidy
go: finding module for package github.com/gin-gonic/gin
go: found github.com/gin-gonic/gin in github.com/gin-gonic/gin v1.6.2

就是同该命令来更新依赖,添加需要的,移除多余的,更新结果保存在go.mod以及go.sum。

go.mod可以加入版本管理,go.sum不建议,避免跨平台校验可能出错,而且执行go mod tidy可以自动生成。

➜  go-mod-test tree .
.
├── go.mod
├── go.sum
└── src
    ├── main.go
    └── pk1
        ├── pk1
        │   └── pk1.go
        └── pk1.go

go.mod文件比初始化后多了一行依赖记录,版本号是自动更新的,也可以手动修改该文件指定版本号。

➜  go-mod-test cat go.mod
module go-mod-test

go 1.14

require github.com/gin-gonic/gin v1.6.2

go.sum保存了依赖的传递以及其版本号、hash值

➜  go-mod-test cat go.sum
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3 rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI c5H38=
...省略N行...
h1:hI93XBmqTisBFMUTm0b8Fm jr3Dg1NNxqwp 5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm jr3Dg1NNxqwp 5A1VGuI=

到目前为止,我们用了两条命令,即

go mod init module-name
go mod tidy

下面看看go mod 有哪些功能

➜  go-mod-test go mod help
Go mod provides access to operations on modules.

Note that support for modules is built into all the go commands,
not just 'go mod'. For example, day-to-day adding, removing, upgrading,
and downgrading of dependencies should be done using 'go get'.
See 'go help modules' for an overview of module functionality.

Usage:

	go mod <command> [arguments]

The commands are:

	download    download modules to local cache
	edit        edit go.mod from tools or scripts
	graph       print module requirement graph
	init        initialize new module in current directory
	tidy        add missing and remove unused modules
	vendor      make vendored copy of dependencies
	verify      verify dependencies have expected content
	why         explain why packages or modules are needed

Use "go help mod <command>" for more information about a command.

原来命令也不多,除了刚才的两个另外关注

go mod download

看名字指定是下载依赖到本地缓存,那本地保存在哪呢?我们想起了前面说到的默认GOPATH

➜  ~ tree $GOPATH -L 4
/Users/alexhu/go
└── pkg
    ├── mod
    │   ├── cache
    │   │   └── download
    │   ├── github.com
    │   │   ├── davecgh
    │   │   ├── gin-contrib
    │   │   ├── gin-gonic
    │   │   ├── go-playground
    │   │   ├── golang
    │   │   ├── google
    │   │   ├── json-iterator
    │   │   ├── leodido
    │   │   ├── mattn
    │   │   ├── modern-go
    │   │   ├── pmezard
    │   │   ├── stretchr
    │   │   └── ugorji
    │   ├── golang.org
    │   │   └── x
    │   └── gopkg.in
    │       ├── check.v1@v0.0.0-20161208181325-20d25e280405
    │       └── yaml.v2@v2.2.8
    └── sumdb
        └── sum.golang.org
            └── latest

25 directories, 1 file

果然,都下载到了$GOPATH/pkg/mod目录下了!其它命令试试就知道了!这里提醒下

go mod vendor

会在项目中建立vendor目录,将依赖下载在该目录中,目录结构类似前面说的的pkg/mod目录,整个项目打包的话方便没有网络也可以编译项目。一般情况下不要提交本目录到版本管理中。