「Go」Go语言之依赖管理

不住隔壁的王老师 · · 1210 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

不积跬步,无以至千里;不积小流,无以成江海。

码字不易,点赞再看。

Go语言的依赖管理随着版本的迭代正逐渐完善起来。

依赖管理

常见的包管理有,dep、go vendor、glide、go modules 等。过时的东西就不在去研究,这里主要说一下 go modules,go modules是Go1.11版本之后官方推出的版本管理工具,并且从 Go1.13 版本开始,go modules将是Go语言默认的依赖管理工具。

GO111MODULE

要启用go modules 支持首先要设置环境变量 GO111MODULE(通过go env看),通过它可以 开启 或 关闭 模块支持,它有三个可选值:off、on、auto,默认值是auto。

  1. GO111MODULE=off 禁用模块支持,编译时会从GOPATH和vendor文件夹中查找包。

  2. GO111MODULE=on启用模块支持,编译时会忽略GOPATH和vendor文件夹,只根据 go.mod下载依赖。

  3. GO111MODULE=auto,当项目在$GOPATH/src外且项目根目录有go.mod文件时,开启模块支持。

简单来说,设置GO111MODULE=on之后就可以使用go module了,以后就没有必要在GOPATH中创建项目了,并且还能够很好的管理项目依赖的第三方包信息。使用 go modules 管理依赖后会在项目根目录下生成两个文件 go.mod 和go.sum。

GOPROXY

Go1.11之后设置GOPROXY命令为:

export GOPROXY=https://goproxy.cn

Go1.13之后GOPROXY默认值为 https://proxy.golang.org,在国内是无法访问的,所以十分建议大家设置GOPROXY,推荐使用 goproxy.cn

go env -w GOPROXY=https://goproxy.cn,direct

go mod

常用的go mod 命令

  • go mod download 下载依赖的module到本地cache(默认为$GOPATH/pkg/mod目录)
  • go mod init 初始化当前文件夹, 创建go.mod文件
  • go mod tidy 增加缺少的module,删除无用的module
  • go mod vendor 将依赖复制到vendor下
  • go mod graph 打印模块依赖图
  • go mod edit 编辑go.mod文件
  • go mod verify 校验依赖
  • go mod why 解释为什么需要依赖
go.mod

go.mod 文件记录了项目所有的依赖信息,其结构大致如下:

module github.com/xxx/studygo/

go 1.13

require (
    github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
    github.com/gin-gonic/gin v1.4.0
    github.com/go-sql-driver/mysql v1.4.1
    github.com/jmoiron/sqlx v1.2.0
    github.com/satori/go.uuid v1.2.0
    google.golang.org/appengine v1.6.1 // indirect
)

其中,

  • module 用来定义包名
  • require 用来定义依赖包及版本
  • indirect 表示间接引用
replace

在国内访问golang.org/x的各个包都需要翻墙,你可以在go.mod中使用replace替换成github上对应的库。

replace (
    golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
    golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
    golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
go mod edit

格式化

因为我们可以手动修改go.mod文件,所以有些时候需要格式化该文件。Go提供了一下命令:

go mod edit -fmt

添加依赖项

go mod edit -require=golang.org/x/text

移除依赖项

如果只是想修改go.mod文件中的内容,那么可以运行go mod edit -droprequire=package path,比如要在go.mod中移除golang.org/x/text包,可以使用如下命令:

go mod edit -droprequire=golang.org/x/text

go Modules 使用

已有项目

如果需要对一个已经存在的项目启用go module,可以按照以下步骤操作:

在项目目录下执行go mod init,生成一个go.mod文件。
执行go get,查找并记录当前项目的依赖,同时生成一个go.sum记录每个依赖库的版本和哈希值。

新项目

对于一个新创建的项目,我们可以在项目文件夹下按照以下步骤操作:

执行go mod init 项目名命令,在当前项目文件夹下创建一个go.mod文件。
手动编辑go.mod中的require依赖项或执行go get自动发现、维护依赖。

实战

在 GOPATH 之外的地方,新建一个空文件夹 go-study。

cd go-stydy && go mod init go-study

输出:

go: creating new go.mod: module go-stydy

这时目录中多一个 go.mod 文件,内容如下:

module go-study

go 1.13

接下来我们新建 main.go,添加下官方的例子

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(":9999") // listen and serve on 0.0.0.0:8080
}

下载依赖包。

go mod tidy

执行完成后,看一下 go.mod 文件:

module go-study

go 1.13

require github.com/gin-gonic/gin v1.6.2

看到新增一个 gin v1.6.2 的包。还生成了一个 go.sum 的文件,记录每个依赖库的版本和哈希值,可以打开看一下。

执行看效果

控制台 输入 go run main.go

浏览器输入:localhost:9999/ping

看到浏览器有json输出 {"message":"pong"}

疑问:

  1. 目录中没发现 gin 包,包下载到哪了?
    在 GOPATH/pkg/mod 目录中。

2.GoLand 编辑器中关于 Gin 的引用变红了?
可以通过编辑器设置


image.png
点关注 不迷路

如果你从本篇内容有收获,求 点赞,求 关注,求 转发 ,让更多的人学习到。


如果本文有任何错误,请批评指教,不胜感激 !


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:不住隔壁的王老师

查看原文:「Go」Go语言之依赖管理

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1210 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传