Go语言快速上手 (4)- GoModule|青训营

70 阅读3分钟

GOPATH与GoModules

GOPATH组成

bin:项目二进制文件

pkg:项目编译的中间产物,加速编译

src:项目源码

项目代码直接依赖src下的代码;go get下载最新版本的包到src目录下

弊端:

无版本概念,无法实现package的多版本控制;无法同步一致第三方版本号;无法指定当前项目引用的第三方版本号

GoModules模式

依赖管理三要素:go.mod(配置文件,描述依赖);Proxy(中心仓库管理依赖库);go get/mod(本地工具)

1.go mod 命令

go mod init         生成go.mod文件
go mod download     下载go.mod文件中指明的所有依赖
go mod tidy         整理现有的依赖
go mod graph        查看现有的依赖结构
go mod edit         编辑go.mod文件
go mod vendor       导出项目所有的依赖到vendor目录
go mod verity       校验一个模块是否被篡改过
go mod why          查看为什么需要依赖某模块

2.go mod 环境变量

(1)1.16go版本后GO111MODULE(此为是否开启go modules模式)默认开启,开启代码:

$ go env -w GO111MODULE=on
export GO111MODULE=on     // source ~/.bashrc

(2)GOPROXY设置(项目的第三方依赖库下载源地址):

GOPROXY="proxy1.cn, proxy2.cn,direct" 服务站点URL列表,“direct”表示源站

Proxy1 => Proxy2 => Direct

默认值无梯子上不去,所以要设置成墙内地址:阿里云*mirrors.aliyun.com/goproxy/* 七牛云*goproxy.cn,direct*

$ go env -w GOPROXY=http://goproxy.cn,direct    //direct是可以在找不到的时候再去源的地址拉取数据

(3)GOSUMDB设置(用来校验第三方库是否是完整):

默认是国外的网站,设置好GOPROXY自动会改变GOSUMDB,不需要再设置这个了,然后主包下载基本会跟着GOPROXY来走。

(4)GONOPROXY/GONOSUMDB/GOPRIVATE():

三者只需要设置GOPRIVATE,私有库,设置好之后,私有库可以不经过GOPROXY导入,也不会通过GOSUMDB校验。

go env -w GOPRIVATE = "*.example.com"

*.example.com表示所有模块路径为example.com的子域名,比如git.example.com或者hello.example.com都不进行GOPROXY下载和校验。

3.GoModules初始化项目:

(1)保证GoModules是开启的:

(2)任意文件夹创建一个项目(不要求在GOPATH/src创建)在Linux中例子:mkdirpGOPATH/src创建) 在Linux中例子:`mkdir -p HOME/aceld/modules_test`

(3)创建go.mod文件,同时起当前项目的模块名称。之后生产一个go mod文件:

go mod init github.com/aceld/module_test

(4)在该项目编写源代码:

如果在源代码中想要依赖某个库,可以利用go get来直接下载包

go get github.com/...     //手动
module github.com/...     //自动

此时的go mod文件会添加一行新代码:

require github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 // indirect

含义当前模块依赖github.com/aceld/zinx;依赖的版本是v0.0.0-20200315073925-f09df55dc746;表示间接依赖://indirect,因为项目直接依赖的是znet包,所以间接依赖zinx包

(5)会生成一个go.sum文件:

github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 h1:TtirncEfboY81jsKVSQtGkqk8FN8ag0TmKYzaFHflmQ=
github... h1:...=

go.sum文件的作用:罗列当前项目直接或间接的依赖所有模块版本,保证今后项目依赖的版本不会被篡改。

h1:hash表示整体项目的zip文件打开之后的全部文件的校验和来生成的hash,如果不存在,kennel表示依赖的库可能用不上;或者用xxx/go.mod h1:hashgo.mod文件做的hash,肯定存在。

改变模块依赖关系

Proxy做依赖中介,非常的稳定可靠

(1)版本分辨:例如V1.3.0。不同Major间可以代码隔离的;Minor是新增函数或者功能,在major下必须做到前后兼容;patch为代码修复

${MAJOR}.${MINOR}.${PATCH}

基于commit的伪版本

vx.0.0-yyyymmddhhmmss-abcdefgh1234

(2)新老版本兼容问题,如果需要改回老版本时,可以这么做:

go mod edit -replace=zinx@v0.0.0-20200306023939bc416543ae24=zinx@v0.0.0-20200221135252-8a8954e75100

这样的话go mod文件就会被修改成

require github.com/aceld/zinx v0.0.0-20200315073925-f09df55dc746 // indirect
replace zinx v0.0.0-20200306023939-bc416543ae24 => zinx@v0.0.0-20200221135252-8a8954e75100