GOPATH
go 1.6 前,GOPATH 作为第三方的依赖目录。
GOPATH 默认位置~/go (linux, unix, Mac)
临时GOPATH
export GOPATH=/path/to/dir
export GO111MODULE=off
第三方库存放位置,GOPATH目录下的src 目录下,/path/to/dir/src
依赖查找路径
- GOROOT
- GOPATH
GOVENDER
go 1.6 版本发布,vender 目录被添加到除GOPATH 和GOROOT 之外的依赖目录。
依赖查找路径
- 当前目录中
vender 目录下
- 向上级查找,直到找到src下的
vender 目录
- GOROOT
- GOPATH
GO MODULE
go 1.8 加入 go mod 作为依赖管理。
特点: 依赖由go命令统一管理,开发者不用关心目录结构。
go module 解决的问题
-
go代码能否脱离GOPATH运行
-
能否处理版本依赖并选择最兼容的依赖版本
-
能否使用go工具本地管理依赖项并自定义依赖项版本
Usage
常用命令列表
-
go mod init 初始化模块,例如 go mod init github.com/wjp2013/hello
-
go build, go test 和其它构建命令会自动为 go.mod 添加新的依赖
-
go get 改依赖关系的所需版本(或添加新的依赖关系)
-
go list -m all 列出当前模块及其所有依赖项
-
go mod tidy 拉取缺少的模块,移除不用的模块
不常用命令
-
go mod download 下载依赖包到本地 cache
-
go mod edit 编辑 go.mod 文件,选项有 -json、-require 和 -exclude,可以使用帮助 go help mod edit
-
go mod graph 打印模块依赖图
-
go mod vendor 将依赖复制到 vendor 目录
-
go mod verify 验证依赖是否正确
-
go mod why 解释为什么需要依赖
使用示例
开启GO111MODULE
Go Modules 是否启用目前由环境变量 GO111MODULE 控制。
-
临时修改
export GO111MODULE=off
-
修改全局变量
go env -w GO111MODULE=on
使用过程
-
创建go mod
go mod init test.com 会在当前目录下创建一个 go.mod 文件,模块名为test.com 。
-
生成依赖
- 方法1: 有了模块定义,然后执行
go mod tidy 会自动生成依赖,填充 go.mod, go.sum 文件。
- 方法2: 修改源码用 import 引入模块 然后执行
go build, go test 等命令,会更新 go.mod, go.sum 文件。
-
更新依赖
go list -m all 查看当前项目正在使用的 package 版本,然后执行 go get xxx/xxx 来更新指定的 package, 再执行 go test 会自动更新 go.mod 文件。
go mod cache
// 导入buffalo
import "github.com/gobuffalo/buffalo"
// 缓存实际位置
// ==> $GOPATH/src/github.com/gobuffalo/buffalo
语义版本
每个语义版本都采用v主版本号.次版本号.修订版本号
go mod的版本选择
最低版本选择 选择项目中最合适的最低版本
示例
A -> D v1.0.1
==> D v1.0.2
B -> D v1.0.2
项目依赖模块A、B,模块A依赖模块D_v1.0.1,模块B依赖模块D_v1.0.2;根据最小版本规则,则选择最终D的版本为v1.0.2;
此时,如果删除模块B,则不再依赖Dv1.0.2,但v1.0.2 不会降级到v1.0.1;因为此时的A在Dv1.0.2下可以运行。
大版本升级导致包导入格式的变化
当大版本升级时,包的导入需要带上版本号,原因是大版本升级了,API不兼容,因此修改导入的格式也就比较正常了。
// 版本升级到 v2.3.4
// old
import "github.com/PoplarYang/golib"
// 升级后
import "github.com/PoplarYang/golib/v2"
升级依赖项
>$ go list -m -versions github.com/gin-gonic/gin
// 将会列出 Gin 版本历史
github.com/gin-gonic/gin v1.1.1 v1.1.2 v1.1.3 v1.1.4 v1.3.0
将版本更新到上个版本,这里只是个演示。
>$ go get github.com/gin-gonic/[email protected] // 只需要在依赖后面加上 @version 就可以了
>$ go list -m all
// 看到了版本变化
github.com/gin-gonic/gin v1.1.4
或者可以使用 go mod 来进行版本的切换,这样就需要两个步骤了:
>$ go mod edit -require="github.com/gin-gonic/[email protected]" // 修改 go.mod 文件
>$ go mod tidy //下载更新依赖
或者直接修改go.mod 文件,然后执行go mod tidy
// go.mod 方式
require github.com/gobuffalo/buffalo latest --> 最新版
require github.com/gobuffalo/buffalo version --> 指定版本
require github.com/gobuffalo/buffalo commit_id --> 指定commit_id
Go 国内加速镜像
国内网络访问国外资源经常会出现不稳定的情况。因此设置 CDN 加速代理就很有必要了,以下是几个速度不错的提供者:
使用方法
# 启用 Go Modules 功能
go env -w GO111MODULE=on
# 配置 GOPROXY 环境变量
go env -w GOPROXY=xxxx
Refer: Go module
|
请发表评论