在Go1.11时,官方推出了go mod作为官方的依赖管理工具。而go mod与之前的利用vendor特性的依赖管理工具的不同点在于,go mod 更类似于maven这种本地缓存库的管理方式,不论你有多少个工程,只要你引用的依赖的版本是一致的,那么在本地就只会有一份依赖文件的存在。而vendor即使依赖的版本是相同的,但如果在不同的工程中进行了引用,也会在工程目录下的vendor产生一份依赖文件。
所以Golang在1.11版本中引入了go mod机制,在统一的位置对依赖进行管理。
go mod不同于以往基于GOPATH和Vendor的构建方式,其主要是通过GOPATH/pkg/mod下的缓存包来对工程进行构建。在Go 1.11中已经可以使用,同以往新添加的功能一样,go mod 可以通过GO111MODULE来控制是否启用,GO111MODULE有一下三种类型。
go mod tidy 从 go.mod 删除不需要的依赖、新增需要的依赖,这个操作不会改变依赖版本。
go mod download命令会根据go.mod文件下载对应的依赖项到GOPATH/pkg/mod路径下。
go get 命令
在Go1.11后,可以用此命令来获取依赖的特定版本,可以用来升级和降级依赖。会自动修改 go.mod 文件,而且依赖的依赖版本号也可能会变。在 go.mod 中使用 exclude 排除的包,不能 go get 下来。
与以前不同的是,新版 go get 可以在末尾加 @ 符号,用来指定版本。go get 命令需在go.mod同级目录下执行,否则会报出错误go: cannot use path@version syntax in GOPATH mode。而且在使用go get下载依赖时,要求仓库必须用 vX.Y.Z 格式打 tag,以下是简单罗列的匹配规则。
go get github.com/gorilla/mux # 匹配最新的一个 tag
go get github.com/gorilla/mux@latest # 和上面一样
go get github.com/gorilla/mux@v1.6.2 # 匹配 v1.6.2
go get github.com/gorilla/mux@e3702bed2 # 匹配 v1.6.2
go get github.com/gorilla/mux@c856192 # 匹配 c85619274f5d
go get github.com/gorilla/mux@master # 匹配 master 分支
go build 命令
go build -mod=readonly 防止隐式修改 go.mod,如果遇到有隐式修改的情况会报错,可以用来测试 go.mod 中的依赖是否整洁,但如果明确调用了 go mod、go get 命令则依然会导致 go.mod 文件被修改。
go build -mod=vendor 在开启模块支持的情况下,用这个可以退回到使用 vendor 的时代
请发表评论