go mod 教程

一、简介

一个类似于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.

命令说明:

命令说明
downloaddownload modules to local cache(下载依赖包)
editedit go.mod from tools or scripts(编辑go.mod)
graphprint module requirement graph (打印模块依赖图)
verifyinitialize new module in current directory(在当前目录初始化mod)
initinitialize new module in current directory(在当前目录初始化一个新的module)
tidyadd missing and remove unused modules(拉取缺少的模块,移除不用的模块)
vendormake vendored copy of dependencies(将依赖复制到vendor下)
verifyverify dependencies have expected content (验证依赖是否正确)
whyexplain 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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值