Go的包管理 - go modules

CatharineBuck 发布于9月前

一、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

clipboard.png

References

  1. https://blog.golang.org/using-go-modules
  2. https://learnku.com/articles/27401
  3. https://juejin.im/post/5d0b86...

查看原文: Go的包管理 - go modules

  • greengoose
  • goldengoose
  • goldenfish
  • purpleostrich
  • crazylion