go modules

go modules

声明

本文部分内容引用了@JaguarJack的《Go Modules 详解使用》

go modules是Golang 1.11增加新特性,是Golang自带的依赖管理工具。在Golang v1.11和v1.12版本中,go modules默认是没有开启的,需要设置环境变量GO111MODULE,从v1.13版本开始,go module默认开启。

GO111MODULE

如果你的Golang版本是v1.11和v1.12,需要通过设置环境变量GO111MODULE来开启go modules功能。

GO111MODULE有3个值off、on、auto:

  • GO111MODULE=off:关闭go modules功能,在编译的时候仍旧在$GOPATH/src或者vendor目录中寻找依赖
  • GO111MODULE=on:开启go modules功能,在编译时不会在$GOPATH/src或者vendor目录中寻找依赖。此时,开发者可以将项目目录创建在$GOPATH/src目录之外任意位置,且项目根目录生成go.mod文件。同时,依赖包不再存放在$GOPATH/src目录,而是存放在$GOPATH/pkg/mod目录,多个项目可以共享缓存的modules。
  • GO111MODULE=auto:Golang v1.13的默认值,如果项目不在$GOPATH/src目录,且项目根目录有go.mod文件,则开启go modules功能

设置GO111MODULE

如果你的Golang版本是v1.13及以上 (goproxy官方推荐)

go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.io,direct

如果你的Golang版本是v1.11和v1.12
(1) Linux系统
/etc/profile文件添加如下命令,然后执行source /etc/profile使配置文件生效。

export GO111MODULE=on
export GOPROXY=https://goproxy.io

(2) Windows环境
使用Powershell执行如下命令:

$env:GO111MODULE="on"
$env:GOPROXY="https://goproxy.io"

go mod

Golang提供了一系列go mod相关命令用来管理依赖,命令列表如下:

命令 说明
init 在当前目录初始化module,生成go.mod文件
download 下载go.mod文件中指定的依赖
edit 编辑go.mod文件
tidy 下载缺少的依赖,删除无用的依赖
vendor 在项目中创建vendor目录,然后将依赖包复制到vendor目录
graph 显示各个依赖包之间的关系图
verify 验证依赖是否正确
why 解释为什么需要依赖

go mod init
在任意位置创建目录,使用go mod init命令来初始化module,在当前目录生成go.mod文件。

cd ~ & mkdir -p gomod/demo
cd gomod/demo
go mod init demo

生成完go.mod文件后,其文件内容会被go toolchain掌控,当执行go buildgo rungo testgo get等命令时都会对go.mod文件进行维护。

go mod edit
现在在demo项目中新建main.go文件,尝试在demo中使用gin框架。
首先,下载gin框架:

go get -u github.com/gin-gonic/gin

然后,在main.go文件中使用gin框架,下面的示例来自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() // 监听并在 0.0.0.0:8080 上启动服务
}

执行go run main.go 命令,此时go.mod文件内容如下:

module learngin

go 1.13

require github.com/gin-gonic/gin v1.6.3 // indirect

从go.mod文件可以看出,引入的gin框架版本是v1.6.3,接下来可以使用go mod edit命令自由的切换不同版本的依赖。
首先,查看gin框架的历史版本:

go list -m -versions github.com/gin-gonic/gin 

列出如下历史版本:
go modules
然后,将gin框架更新至指定的版本:

// 修改go.mod文件
go mod edit -require="github.com/gin-gonic/gin@v1.6.2"
// 下载缺少的依赖,删除无用的依赖
go mod tidy

除此之外,还可以使用go get来更新依赖版本:

// 在依赖后面加上@version指定版本号
go get github.com/gin-gonic/gin@v1.6.2

go mod tidy
使用go mod tidy命令会自动删除项目中不需要的依赖,同时下载缺少的依赖。

总结

本文首先是简单的介绍了Golang v1.11增加的一个新特性go modules;然后介绍了如何开启go modules功能以及配置代理;最后是介绍了几个常用go mod命令。

生命不息,学习不止

本作品采用《CC 协议》,转载必须注明作者和本文链接
greedyco
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!