GOPATH
表示go的工作目录,这个目录指定了需要从哪个地方寻找GO的包、可执行程序等,这个目录可以是多个目录表示,
go编译或者运行时会从这个环境变量中去对应查找,可能还不够清晰,工作目录或者如官方文档中说的workspace,
可以这么理解为GO源码目录,在这个目录进行编译、链接最后生成所需要的库、可执行文件
GOROOT
表示的是go语言编译、工具、标准库等的安装路径。
在Linux下设置GOROOT目录:
export GOROOT=$HOME/go
GOPROXY,简单来说就是一个代理,让我们更方便的下载哪些由于墙的原因而导致无法下载的第三方包,
比如golang.org/x/下的包,虽然也有各种方法解决,但是,如果是你在拉取第三方包的时候,而这个包又依赖于golang.org/x/下的包,
你本地又恰恰没有,当然不嫌麻烦的话,也可以先拉取golang.org/x/下的包,再拉取第三方包。
官网是这么说的 A Global Proxy for Go Modules go包的全球代理。
proxy.golang.org 在中国无法访问,故而建议使用 goproxy.cn 作为替代。
我个人配置
其实值列表中的 “direct” 为特殊指示符,
用于指示 Go 回源到模块版本的源地址去抓取 (比如 GitHub 等),当值列表中上一个 Go module proxy 返回 404 或 410 错误时,Go 自动尝试列表中的下一个,
遇见 “direct” 时回源,遇见 EOF 时终止并抛出类似 “invalid version: unknown revision...” 的错误。
GO111MODULE
export GO111MODULE=on # 开启GoModule特性
或者在环境信息文件/etc/profile的最后面添加上一行
export GO111MODULE=on
GO111MODULE解释, 当为on时则使用Go Modules,go 会忽略 $GOPATH和 vendor文件夹,只根据go.mod下载依赖。
当为 off时则不适用新特性 Go Modules支持,它会查找 vendor目录和 $GOPATH来查找依赖关系,也就是继续使用“GOPATH模式”。
当为 auto时或未设置时则根据当前项目目录下是否存在 go.mod文件或 $GOPATH/src之外并且其本身包含go.mod文件时才会使用新特性 Go Modules模式,
并且auto为 GO111MODULE的默认值。
go modules
golang官方建议是一个项目一个GOPATH,但是鉴于很多人都不这么做(我也不这么做,因为麻烦),
于是在go1.11的时候推出了这个go modules来解决依赖管理的问题。
使用:
生成 go.mod 文件
go mod init
加载 pakage 到 GOPATH\pkg\mod 下
go mod tidy
配合go get使用(版本筛选):
go get 自动下载package包到 GOPATH\pkg\mod 目录下,并更新go.mod文件
go get package[@version]来安装指定版本的package,默认go get package@latest
version可以是vx.y.z这种形式或者直接使用commit的checksum,也可以是master或者latest
当version是master时,不管package有没有打tag,都会选择master分支的最新commit
可以在version前使用>,>=,<,<=,表示选取的版本不得超过/低于version,在这个范围内的符合latest条件的版本
当想要修改package的版本时,只需要go get package@指定的version即可
GOPRIVATE
go get通过代理服务拉取私有仓库(企业内部module或托管站点上的private库),而代理服务不可能访问到私有仓库,会出现了404错误
go1.13版本提供了一个方便的解决方案:GOPRIVATE环境变量。
export GOPRIVATE=gitlab.com/xxx
私有库访问可以通过命令git config ...的方式来配置
已经配置了ssh key,将https访问转换为 ssh 访问:
[url "[email protected]:"] insteadOf = https://github.com/ [url "[email protected]:"] insteadOf = https://gitlab.com/
GONOPROXY 和 GONOSUMDB
GONOPROXY和GONOSUMDB均为none,意味着所有module,不管是公共的还是私有的,
都要经过proxy下载,经过sumdb验证
GONOPROXY="《*.xxx,com》"
GONOSUMDB="《*.xxx,com》"
《*.xxx,com》网站不走代理拉取第三方包