在 Go 1.11 引入了模块支持,想借此解决包依赖管理问题。
所谓依赖,就是所导入的包。
无模块支持
首先了解两个重要的环境变量,在没有模块支持时,项目管理与这两个变量有很大关系。
- GOROOT:安装 Go 的路径,内置功能都在里面,编译时需要用到,比如内置包 fmt, runtime, container 等。
- GOPATH:在没有模块支持时的工作路径,下面有 bin, pkg, src 三个文件夹,写代码都要在这个目录下的 src 文件夹里写,下载的依赖都在 pkg 文件夹里。
- bin 用于存放编译后生成的可执行文件,在 windows 10 下即 .exe 文件。
- pkg 用于存放编译后生成的文件和下载的依赖包,在 windows 10 下如 .a 文件。
- src 用于源码。
打开模块支持
通过 go env
查看模块支持开关。
通过 go env -w variableName=value
可以设置环境变量的值。
比如 go env -w GO111MODULE=on
打开模块支持。
开启模块支持后,GOPATH 无意义,你想在哪建项目就在哪建,但是还是有如下注意点:
- 当引用外部模块/依赖时,下载的依赖还是存放在 $GOPATH/pkg/mod 中。
引入本地模块
首先开启了模块支持,还要懂相对路径和绝对路径。
比如项目结构如下:
比如现在 main.go 里需要引用 mutex 模块(mutex 是自己写的本地模块)。
package main
import (
"fmt"
"mutex"
)
func main() {
fmt.Println("hello, world!")
mutex.Say()
}
需要在 main.go 所在的模块文件 go.mod 中通过 require 获取依赖以及 replace 替换依赖。
module readygo
require (
"mutex" v0.0.0 // 记得随便写个版本号
)
replace (
"mutex" => "./mutex" // 使用相对路径表示 mutex 模块的具体位置
)
go 1.16
下载依赖
通常依赖都从需要 github 上下载,而国内网络都有防火墙,访问 github 不稳定,因此需要一个中间代理。
推荐使用国内的代理服务器 goproxy.cn,由国内的七牛云提供.
windows 设置方法:go env -w GOPROXY=https://goproxy.cn,direct
Linux 或 MacOS 设置方法:export GOPROXY=https://goproxy.cn
使用 go get
下载依赖包
go get -u
包路径:下载指定包的最新版本。- 如
go get -u github.com/gin-gonic/gin
下载 gin 框架。 - 如
**go get -u=patch**
将项目中的包升级到最新的修订版本。
- 如
go get
包路径@版本号:下载指定版本的包。- 如
go get github.com/gin-gonic/gin@v1.5.0
- 如
常用 go mod 命令
命令 | 作用 |
---|---|
go mod init | 初始化当前文件夹,创建 go.mod 文件 |
go mod tidy | 增加缺少的包,删除无用的包 |
go mod graph | 打印模块依赖图 |
go mod download | 下载依赖包到本地(默认为 GOPATH/pkg/mod 目录) |
go mod verify | 校验依赖 |
go mod why | 解释为什么需要依赖 |
go mod edit | 编辑 go.mod 文件 |
go mod vendor | 将依赖复制到 vendor 目录下 |