在 Go 1.11 引入了模块支持,想借此解决包依赖管理问题。
所谓依赖,就是所导入的包。

无模块支持

首先了解两个重要的环境变量,在没有模块支持时,项目管理与这两个变量有很大关系。

  1. GOROOT:安装 Go 的路径,内置功能都在里面,编译时需要用到,比如内置包 fmt, runtime, container 等。
  2. GOPATH:在没有模块支持时的工作路径,下面有 bin, pkg, src 三个文件夹,写代码都要在这个目录下的 src 文件夹里写,下载的依赖都在 pkg 文件夹里。
    1. bin 用于存放编译后生成的可执行文件,在 windows 10 下即 .exe 文件。
    2. pkg 用于存放编译后生成的文件和下载的依赖包,在 windows 10 下如 .a 文件。
    3. src 用于源码。

打开模块支持

通过 go env 查看模块支持开关。
image.png
通过 go env -w variableName=value 可以设置环境变量的值。
比如 go env -w GO111MODULE=on 打开模块支持。

开启模块支持后,GOPATH 无意义,你想在哪建项目就在哪建,但是还是有如下注意点:

  • 当引用外部模块/依赖时,下载的依赖还是存放在 $GOPATH/pkg/mod 中。

引入本地模块

首先开启了模块支持,还要懂相对路径和绝对路径。

比如项目结构如下:
image.png
比如现在 main.go 里需要引用 mutex 模块(mutex 是自己写的本地模块)。

  1. package main
  2. import (
  3. "fmt"
  4. "mutex"
  5. )
  6. func main() {
  7. fmt.Println("hello, world!")
  8. mutex.Say()
  9. }

需要在 main.go 所在的模块文件 go.mod 中通过 require 获取依赖以及 replace 替换依赖。

  1. module readygo
  2. require (
  3. "mutex" v0.0.0 // 记得随便写个版本号
  4. )
  5. replace (
  6. "mutex" => "./mutex" // 使用相对路径表示 mutex 模块的具体位置
  7. )
  8. 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 目录下