Go-知识依赖GOPATH
- 1. 介绍
- 2. GOROOT 是什么
- 3. GOPATH 是什么
- 4. 依赖查找
- 5. GOPATH 的缺点
1. 介绍
早期Go语言单纯地使用GOPATH管理依赖,但是GOPATH不方便管理依赖的多个版本,后来增加了vendor,允许把项目依赖
连同项目源码一同管理。Go 1.11 引入了全新的依赖管理工具 Go Module ,知道 Go 1.14 , Go Module 才走向成熟。
2. GOROOT 是什么
通常安装 Go 语言,实际上安装的是 Go 编译器和 Go 标准库,二者位于同一个安装包中。
在Win中使用安装程序安装Go,那么会被默认安装到 c:\Go 目录下,这就是 GOROOT 目录,这个目录就是 GOROOT 目录,
里面保存了开发Go应用程序所需要的所有组件,比如编译器,标准库和文档。
GOROOT有点像JAVA_HOME。
另外安装程序会设置GOROOT环境变量,并且还会把%GOROOT%\bin加入到Path 环境变量中。
完全和Java一样。
3. GOPATH 是什么
安装完Go语言,接下来就要编写项目了。实际上Go语言项目是由一个或者多个package组成的,这些package安装来源分为这几种:
- 标准库
- 第三方库
- 项目私有库
目前的编程语言基本上都可以这样分类。
其中标准库的 package 全部位于 GOROOT 环境变量指示的目录中,而第三方库和项目私有库都位于 GOPATH 环境变量所指示的目录中。
在安装Go 语言是,安装程序会设置一个默认的 GOPATH 环境变量
与 GOROOT不同的是,GOPATH环境变量是用户环境变量,不是系统环境变量,不同的用户可以设置不同的GOPATH,每个用户之间互不妨碍。
4. 依赖查找
当某个 package 需要引用其他包时,编译器就会依次从 GOROOT/src , GOPATH/src 中查找。
如果某个包从 GOROOT 下找到,就不在到 GOPATH 下查找。
也就是说,如果出现和标准库相同的依赖,那么标准库的优先级是最高的。 这点也和 Java 一模一样。
5. GOPATH 的缺点
GOPATH的优点是简单,但是不能很好地满足实际项目的工程需要。
比如有两个项目A和B,他们都引用某个第三方库T,但这两个项目使用了不同的T版本:
- 项目A使用了 T v1.0
- 项目B使用了 T v2.0
由于编译器依赖固定从 GOPATH/src 下查找 GOPATH/src/T ,无法再同一个GOPATH目录下保存第三方库T的两个版本。
所以项目A 和B 无法共享同一个 GOPATH ,需要各自维护一个。