一、go modules使用
前言
Go的依赖包管理是被大家诟病最多的一个地方,先后出现了glide、godep、dep等包管理工具,但是Go的包管理一直没有一个统一的方法,不同的项目可能会使用不同的管理工具。go modules是go 1.11之后推出的一种新的包管理工具,解决了之前的包管理中存在的一些问题。
- 项目不必放在GOPATH/src下
- 可以自动下载依赖包
- 版本控制功能
go modules介绍
Go 1.11和1.12包含了对modules的初步支持。modules是Go的新的依赖管理系统,能够使依赖项的版本信息更加清晰并且更加容易管理。这篇文章介绍了使用modules的基本操作。
module是Go的包的集合,以文件树的形式存储在顶层目录的go.mod文件中。go.mod文件定义了module的模块路径(也是根目录的导入路径)和依赖项的要求(成功构建其他模块时需要)。每一个依赖项都被写作一个模块路径和特定的语义版本。
go modules 使用的前置条件
Go modules在 go 1.11 和 go 1.12中有三个模式,根据环境变量 GO111MODULE 来定义:
-
默认模式。GO111MODULE未设置,或者GO111MODULE设置为auto时,使用默认模式。同时满足以下两个要求时使用go modules,其他情况使用 vendor目录和$GOPATH来查找依赖
- 当前目录不在$GOPATH/src
- 当前目录或者上层目录中存在go.mod文件
- GOPATH模式。 GO111MODULE=off,go从vendor目录和$GOPATH来查找依赖
- Go modules模式。GO111MODULE=on,Go命令行只使用go modules,GOPATH不再作为导入目录,但是GOPATH依然会存储下载的依赖项和已经安装的命令。
Go 1.13默认使用 go modules模式。
go modules 使用
创建新模块
设置环境变量
$ export GO111MODULE=on
在$GOPATH/src之外的任意一个地方创建文件夹
$ mkdir test && cd test
初始化go modules
$ go mod init test
成功后,在目录下可以看到go.mod文件
添加新的依赖
创建一个文件,写入go代码。此次示例import了gin
$ cat main.go
package main
import (
"github.com/gin-gonic/gin"
"net/http"
)
func HelloGet(c *gin.Context) {
c.String(http.StatusOK, "hello get")
}
func main() {
router := gin.Default()
router.GET("/HelloGet", HelloGet)
router.Run(":8080")
}
运行go build命令后,go modules会自动下载依赖包,并在go.mod文件中加入依赖包
$ cat go.mod
module hello
require github.com/gin-gonic/gin v1.4.0 // indirect
运行go list -m all
可以看到所有的依赖包
$ go list -m all
github.com/davecgh/go-spew v1.1.0
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3
github.com/gin-gonic/gin v1.4.0
github.com/golang/protobuf v1.3.1
github.com/json-iterator/go v1.1.6
...
除了go.mod文件外,go还会维护go.sum文件。go.sum中记录了特定模块版本内容的预期加密哈希。
$ cat go.sum
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g=
...
二、旧项目迁移到新的go modules
$ git clone https://github.com/my/project
进入到项目目录,运行go mod init [your-project] 。 go mod init会创建一个go.mod文件,并从Godeps.json, Gopkg.lock, 以及一些其他的支持的文件格式中自动将项目需要的依赖添加到go.mod文件中。
$ go mod init github.com/my/project
然后运行go mod tidy命令,这一命令会查中项目中的所有引入的依赖项目。
$ go mod tidy
最后对使用go build,go run命令运行项目
三、 Goland使用go mod
References
- https://blog.golang.org/using-go-modules
- https://learnku.com/articles/27401
- https://juejin.im/post/5d0b86...
有疑问加站长微信联系(非本文作者)