go env那些事

一、GOROOT

GOROOT指的Golang语言的安装路径,即Golang语言内置程序库所在的位置。通常在安装时环境变量会设置好GOROOT路径。当开发时,import标准库时并不需要额外安装,当程序运行后,也会去GOROOT路径下寻找相应程序。

二、GOPATH

GOPATH即存放第三方库的位置。通常开发时,会把GOPATH重新设置。

2.1 GOPATH目录

  1. bin:放置编译后生成的可执行文件。
  2. pkg:放置编译后生成的包/库的归档文件;
  3. src:放置项目和库的源文件;1

2.1.1 src

用于以包(package)的形式组织并存放 Go 源文件,这里的包与 src 下的每个子目录是一一对应。例如,若一个源文件被声明属于 log 包,那么它就应当保存在 src/log 目录中。

并不是说 src 目录下不能存放 Go 源文件,一般在测试或演示的时候也可以把 Go 源文件直接放在 src 目录下,但是这么做的话就只能声明该源文件属于 main 包了。正常开发中还是建议大家把 Go 源文件放入特定的目录中。

另外需要注意的是,Go语言会把通过go get命令获取到的库源文件下载到 src 目录下对应的文件夹当中。

2.1.2 pkg

用于存放通过go install命令安装某个包后的归档文件。归档文件是指那些名称以“.a”结尾的文件。

该目录与 GOROOT 目录(也就是Go语言的安装目录)下的 pkg 目录功能类似,区别在于这里的 pkg 目录专门用来存放项目代码的归档文件。

编译和安装项目代码的过程一般会以代码包为单位进行,比如 log 包被编译安装后,将生成一个名为 log.a 的归档文件,并存放在当前项目的 pkg 目录下。

2.1.3 bin

与 pkg 目录类似,在通过go install命令完成安装后,保存由 Go 命令源文件生成的可执行文件。在类 Unix 操作系统下,这个可执行文件的名称与命令源文件的文件名相同。而在 Windows 操作系统下,这个可执行文件的名称则是命令源文件的文件名加 .exe 后缀。

2.2 设置和使用GOPATH

2.2.1 windows设置

在环境变量中添加GOPATH变量,将目录添加即可。

2.2.2 linux设置

设置当前目录为GOPATH:选择一个目录,在目录的命令行下执行

export GOPATH='pwd'

2.3 GOPATH缺点

  1. 只要第三方库不是官方程序库,都要放置到**$GOPATH/src**下才可以使用.

三 Go Modules

Golang从1.13版本开始有Go Modules.

3.1 使用Go Modules的好处

  1. Go Modules可以将某个项目(文件夹)下的所有依赖整理成一个 go.mod 文件,里面写入了依赖的版本等
  2. 使用Go Modules之后我们可不用将代码放置在src下了

3.2 使用Go Modules

官方github关于Modules的WIKI:https://github.com/golang/go/wiki/Modules

使用 Go Modules 管理依赖后会在项目根目录下生成两个文件 go.mod 和 go.sum

  1. go.mod会记录当前项目的所有依赖项

    module test
    
    go 1.15
    
    require github.com/gin-gonic/gin v1.6.3
    
  2. go.sum会记录每个依赖库的版本和哈希值

    github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
    github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
    github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
    github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
    github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
    

3.3 如何开启Go Modules

  1. 要使用Go Modules首先要设置Go111Modules = on, GO111MODULE有三个值

    • on:开启

    • off:关闭

    • auto根据当前目录下是否有go.mod文件来判断是否使用modules功能

    • 注意:**无论使用那种模式,module功能默认不在GOPATH目录下查找依赖文件,所以使用modules功能时请设置好代理

  2. 设置GO111MODULE

    # windows
    set GO111MODULE=on
    # linux
    export GO111MODULE=on
    
  3. 然后使用go env查看

3.4 初始化Go Modules

进入项目文件夹test

# 初始化路径
go mod init test
# 检测依赖
go mod tidy
# 如果有些依赖项未下载则需要下载
go mod download
# 导入依赖
go mod vendor

3.5 GoLand开启Go Modules

  1. 文件(File)
  2. 设置(Setting)
  3. 在GO选项下选择GO MODULES
  4. 启用Go Modules
  5. 设置代理服务器

go env那些事_第1张图片

3.6 更新依赖

# 检测依赖
go mod tidy
# 如果有些依赖项未下载则需要下载
go mod download
# 导入依赖
go mod vendor

3.7 Git使用GO MODULES注意事项

在git中需要把vendor文件夹放入白名单中,不然项目体积会很大。

git设置白名单方式为在git托管的项目根目录新建 .gitignore 文件,设置忽略即可,但是 go.mod 和 go.sum 不要忽略。

另一人clone项目后在本地进行依赖更新(同上方依赖更新)即可

3.8 Go Module常用命令

go mod init  # 初始化go.mod
go mod tidy  # 更新依赖文件
go mod download  # 下载依赖文件
go mod vendor  # 将依赖转移至本地的vendor文件
go mod edit  # 手动修改依赖文件
go mod graph  # 打印依赖图
go mod verify  # 校验依赖
go mod why # 解释为什么需要依赖

四、GO PROXY

GOPROXY 是Go语言官方提供的一种通过中间代理商来为用户提供包下载服务的方式。要使用 GOPROXY 只需要设置环境变量 GOPROXY 即可。

4.1 国内镜像

// 阿里云镜像
GOPROXY=https://mirrors.aliyun.com/goproxy/
// 中国golang镜像
GOPROXY=https://goproxy.io
// 七牛云为中国的gopher提供了一个免费合法的代理goproxy.cn,其已经开源。只需一条简单命令就可以使用该代理:
go env -w GOPROXY=https://goproxy.cn,direct

五、Go Get

执行go get命令,在下载依赖包的同时还可以指定依赖包的版本。

  • 运行go get -u命令会将项目中的包升级到最新的次要版本或者修订版本;
  • 运行go get -u=patch命令会将项目中的包升级到最新的修订版本;
  • 运行go get [包名]@[版本号]命令会下载对应包的指定版本或者将对应包升级到指定的版本。

提示:go get [包名]@[版本号]命令中版本号可以是 x.y.z 的形式,例如 go get [email protected],也可以是 git 上的分支或 tag,例如 go get foo@master,还可以是 git 提交时的哈希值,例如 go get foo@e3702bed2。

六、godep

godep 是一个Go语言官方提供的通过 vender 模式来管理第三方依赖的工具,类似的还有由社区维护的准官方包管理工具 dep。

Go语言从 1.5 版本开始开始引入 vendor 模式,如果项目目录下有 vendor 目录,那么Go语言编译器会优先使用 vendor 内的包进行编译、测试等。

6.1 安装godep

go get github.com/tools/godep

命令执行成功后会将 godep 工具的源码下载到 GOPATH 的 src 目录下对应的文件夹中,同时还会在 GOPATH 的 bin 目录下生成一个名为 godep.exe 的可执行文件。

6.2 配置环境变量

go env那些事_第2张图片

6.3 godep基本命令

命令 说明
godep save 将依赖包的信息保存到Godeps.json文件中
godep go 使用保存的依赖项运行go工具
godep get 下载并安装指定的包
godep path 打印依赖的GOPATH路径
godep restore 在GOPATH中拉取依赖的版本
godep update 更新选定的包或go版本
godep diff 显示当前和以前保存的依赖项集之间的差异
godep version 查看版本信息

6.4 使用godep

执行godep save命令,会在当前目录中创建 Godeps 和 vender 两个文件夹。Godeps 文件夹下会生成一个 Godeps.json 文件,用来记录项目中所依赖的包信息;vender 目录则是用来保存当前项目所依赖的所有第三方包。生成的 Godeps.json 文件的结构如下所示:

{
  "ImportPath": "main",//项目路径信息
  "GoVersion": "go1.13",//go语言版本号
  "GodepVersion": "v80",//godep版本号
  "Deps": [//当前引用的包
    {
      "ImportPath": "github.com/go-gomail/gomail",//依赖包路径
      "Comment": "2.0.0-23-g81ebce5",//版本号
      "Rev": "81ebce5c23dfd25c6c67194b37d3dd3f338c98b1"//哈希值
    }
  ]
}

当所引用的第三方包要升级只需要修改Godep.json里面的依赖包的版本号,让后执行godep save命令即可。

godep查找依赖顺序:

  1. 在项目路径下的vender文件夹中查找
  2. 到GOPATH/src目录查找

你可能感兴趣的:(go)