目录
1.7.4 GONOPROXY/GONOSUMDB/GOPRIVATE
GoPath和Go Module
1.1 GoPath 介绍
GOPATH 是 Go语言中使用的一个环境变量,它使用绝对路径提供项目的工作目录。
在 Go 1.8 版本之前,GOPATH 环境变量默认是空的。从 Go 1.8 版本开始,Go 开发包在安装完成后,将 GOPATH 赋予了一个默认的目录,参见下表。
GOPATH在不同操作系统平台上的默认值
平台 | GOPATH默认值 | 举例 |
---|---|---|
Windows | %USERPROFILE%/go | C:\Users\用户名\go |
Unix | $HOME/go | /home/用户名/go |
GOPATH告知go,需要代码(包括本项目即内部依赖和引用外部项目的代码即外部依赖)的时候去哪里找。GOPATH随着项目的不同重新设置
1.2 GOPATH 目录结构
GOPAT有三个目录:src
bin
pkg
-
src目录:存储所有
.go
文件或源代码。在编写Go应用程序、程序包和库时,一般会以$GOPATH/src/github.con/foo/bar
的路径进行存放 -
bin目录:go get 这种bin工具的时候,二进制文件下载的目的地;golang 编译可执行文件存放路径
-
pkg目录:golang编译包时,生成的中间缓存文件(.a)存放路径。中间缓存文件(.a)是编译过程中生成的,每个package都会生成对应的中间缓存文件(.a),Go在编译的时候先判断package的源码是否有改动,如果没有的话,就不再重新编译中间缓存文件(.a)。
1.2.1 编译时的依赖包查找机制
只要我们的代码里面出现了import 关键字, 就代表我们需要依赖其他的源代码,比如
import "fmt"
import "github.com/jinzhu/gorm"
这个时候 编译器就需要搜索这些源码的存放位置, 搜索顺序为:
-
优先使用vendor目录下面的包
-
如果vendor下面没有搜索到,再搜索$GOPATH/src下面的包
-
如果GOPATH下面没有搜索到,那么搜索GOROOT/src下面的包
比如fmt的搜索({dir}/path):
-
vendor 无
-
$GOPATH/src 无
-
GOROOT/src找到,路径为(GOROOT/src/fmt)
比如第一天我们有这样一个代码:$GOPATH/src/day1/compile/main.go
package main
import "day1/compile/pkg"
func main() {
pkg.Demo()
}
搜索顺序({dir}/path):
-
vendor 无
-
GOPATH/src找到,路径为(GOPATH/src/day1/compile/pkg)
1.3 为什么弃用 GOPATH 模式
在 GOPATH 的 $GOPATH/src
下进行 .go
文件或源代码的存储,我们可以称其为 GOPATH 的模式,这个模式,看起来好像没有什么问
题,那么为什么我们要弃用呢,参见如下原因:
GOPATH 模式下没有版本控制的概念,具有致命的缺陷,至少会造成以下问题:
-
在执行
go get
的时候,你无法传达任何的版本信息的期望,也就是说你也无法知道自己当前更新的是哪一个版本,也无法通过指定来拉取自己所期望的具体版本。