原理就不赘述,大家留心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目录,整个项目打包的话方便没有网络也可以编译项目。一般情况下不要提交本目录到版本管理中。