Go Module原理

Go Module原理

Go

Semantic Version

版本号遵循SemVer规范(https://semver.org/)

semantic_version

最小版本选择(Minimal Version Selection)

semantic_version

Go 1.11之前

GOROOT GOPATH

GOPATH
├── bin              //编译生成的二进制文件
├── pkg              //预编译文件,以加快程序的后续编译速度
|── src              //所有源代码
    ├── github.com
    ...
    ...

缺点:

  • 缺少版本管理

go1.5 vendor

go.mod

go1.11 已经有go mod,只是默认关闭,在go1.13 go mod将作为默认管理方式开启

module

require

replace

replace可以指向一个repo,也可以指向本地

exclude

排除某个版本,实际中很少使用

GOPROXY

地址 简介 https://goproxy.io 一个全球代理为 Go 模块而生 https://mirrors.aliyun.com/goproxy/ 阿里镜像代理 https://goproxy.cn 七牛云赞助支持的

go.sum

用于记录每个依赖包的哈希值(SHA-256 算法) 正常情况下,每个依赖包版本会包含两条记录,第一条记录为该依赖包版本整体(所有文件)的哈希值,第二条记录仅表示该依赖包版本中 go.mod 文件的哈希值,如果该依赖包版本没有 go.mod 文件,则只有第一条记录

go list -m all 查看当前项目最终所使用的 module 版本 go list -u -m all 查看依赖的新版本 go get -u ./... 更新所有依赖到最新版 go get -u=patch ./... 更新所有依赖到最新的 patch 版本 go mod tidy 清理 go.mod/go.sum 中不在需要的 module go mod vendor 创建 vendor 依赖目录,这时为了与之前做兼容,后面在执行 go test/build 之类的命令时,可以加上 -mod=vendor 这个 build flag 声明使用 vendor 里面的依赖,这样 go mod 就不会再去 $GOPATH/pkg/mod 里面去找。

参考


2021-04-19 20:45 +0800