一、简介
一个类似于java maven的包管理工具
使用时需要设置一下go环境变量
go env -w GOBIN=D:\Users\go\bin
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct // 使用七牛云的
go env -w GOSUMDB=off
备注:
1.11和1.12版本
# GO111MODULE=on
# GOPROXY=https://goproxy.io
1.13版本之后
# go env -w GO111MODULE=on
# go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct
当modules功能启用时,依赖包的存放位置变更为$GOPATH/pkg,允许同一个package多个版本并存,且多个项目可以共享缓存的 module
GO111MODULE
有三个值:off, on和auto(默认值)。
- GO111MODULE=off,go命令行将不会支持module功能,寻找依赖包的方式将会沿用旧版本那种通过vendor目录或者GOPATH模式来查找。
- GO111MODULE=on,go命令行会使用modules,而一点也不会去GOPATH目录下查找。
- GO111MODULE=auto,默认值,go命令行将会根据当前目录来决定是否启用module功能。这种情况下可以分为两种情形:
- 当前目录在GOPATH/src之外且该目录包含go.mod文件
- 当前文件在包含go.mod文件的目录下面。
二、go mod命令
golang 提供了 go mod命令来管理包。
go help mod
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.
命令说明:
命令 | 说明 |
---|---|
download | download modules to local cache(下载依赖包) |
edit | edit go.mod from tools or scripts(编辑go.mod) |
graph | print module requirement graph (打印模块依赖图) |
verify | initialize new module in current directory(在当前目录初始化mod) |
init | initialize new module in current directory(在当前目录初始化一个新的module) |
tidy | add missing and remove unused modules(拉取缺少的模块,移除不用的模块) |
vendor | make vendored copy of dependencies(将依赖复制到vendor下) |
verify | verify dependencies have expected content (验证依赖是否正确) |
why | explain why packages or modules are needed(解释为什么需要依赖) |
实例:
初始化一个moudle,模块名为你项目名
# go mod init 模块名
下载modules到本地cache
(目前所有模块版本数据均缓存在 $GOPATH/pkg/mod和 $GOPATH/pkg/sum 下)
# go mod download
编辑go.mod文件 选项有-json、-require和-exclude,可以使用帮助go help mod edit
# go mod edit
以文本模式打印模块需求图
# go mod graph
删除错误或者不使用的modules
# go mod tidy
生成vendor目录
# go mod vendor
验证依赖是否正确
# go mod verify
查找依赖
# go mod why
三、go.mod文件
go.mod文件一旦创建后,它的内容将会被go toolchain全面掌控。go toolchain会在各类命令执行时,
比如go get、go build、go mod等修改和维护go.mod文件。
go.mod 提供了module, require、replace和exclude 四个命令
module
语句指定包的名字(路径)require
语句指定的依赖项模块replace
语句可以替换依赖项模块exclude
语句可以忽略依赖项模块
eg: go.mod
module TestMod
require github.com/gin-gonic/gin v1.6.3
代码:运行时会自动下载 "github.com/gin-gonic/gin"
包
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
r := gin.Default()
r.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "pong",
})
})
r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080")
}
备注:
go module 安装 package 的原則是先拉最新的 release tag,若无tag则拉最新的commit
go 会自动生成一个 go.sum 文件来记录 dependency tree
执行脚本 go run main.go发现跳过了检查并安装依赖的步骤。
可以使用命令 go list -m -u all 来检查可以升级的package,使用go get -u need-upgrade-package 升级后会将新的依赖版本更新到go.mod * 也可以使用 go get -u 升级所有依赖
由于某些已知的原因,并不是所有的package都能成功下载,比如:golang.org下的包。
modules 可以通过在 go.mod 文件中使用 replace 指令替换成github上对应的库,比如:
replace (
golang.org/x/crypto v0.0.0-20190313024323-a1f597ede03a => github.com/golang/crypto v0.0.0-20190313024323-a1f597ede03a
)
四、go get升级
运行 go get -u 将会升级到最新的次要版本或者修订版本(x.y.z, z是修订版本号, y是次要版本号)
运行 go get -u=patch 将会升级到最新的修订版本
运行 go get package@version 将会升级到指定的版本号version
运行go get如果有版本的更改,那么go.mod文件也会更改
go get常用命令:
下载项目依赖
# go get ./...
拉取最新的版本(优先择取 tag)
# go get golang.org/x/text@latest
拉取 master 分支的最新 commit
# go get golang.org/x/text@master
拉取 tag 为 v0.3.2 的 commit
# go get golang.org/x/text@v0.3.2
拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2
# go get golang.org/x/text@342b2e
指定版本拉取,拉取v3版本
# go get github.com/smartwalle/alipay/v3
更新
# go get -u
五、mod高级操作
更新到最新版本
# go get github.com/gogf/gf@version
备注:
如果没有指明 version 的情况下,则默认先下载打了 tag 的 release 版本,比如 v0.4.5 或者 v1.2.3;如果没有 release 版本,则下载最新的 pre release 版本,比如 v0.0.1-pre1。如果还没有则下载最新的 commit
更新到某个分支最新的代码
# go get github.com/gogf/gf@master
更新到最新的修订版(只改bug的版本)
# go get -u=patch github.com/gogf/gf
替代只能FQ下载的库
# go mod edit -replace=golang.org/x/crypto@v0.0.0=github.com/golang/crypto@latest
# go mod edit -replace=golang.org/x/sys@v0.0.0=github.com/golang/sys@latest
清理moudle 缓存
# go clean -modcache
查看可下载版本
# go list -m -versions github.com/gogf/gf