从13年开始接触golang,一直对golang十分喜爱,前前后后写过一些代码,包括业余的,生产环境的项目。 一直想写点总结好让后来人少趟点坑,正好周末天气不好,只能窝在家中写总结。
先说$GOPATH
基本每个刚入门golang的都得先跟$GOPATH过个照面,相信网上也有很多资料,如何设置使go代码运行,怎样设置更适合自己,相信每个老手都有自己的想法与判断。
我且说说我的思考。
- $GOPATH是Golang唯一必须设置的环境变量
- $GOPATH指向的golang的标准工作区
- $GOPATH可以根据具体情况自由更改
- $GOPATH可以指定多个位置
golang官方关于$GOPATH的介绍如下:
The GOPATH environment variable is used to specify directories outside of $GOROOT that contain the source for GO projects and their binaries.
$GOPATH是一个环境变量。它指定golang项目的源码和可执行码路径。在$GOROOT之外。
不得不提下$GOROOT。
$GOROOT是GO可执行命令的路径,默认为操作系统的个人用户可执行目录。如Ubuntu下/usr/local/bin
。
如果通过安装文件(dmg/exe)或包管理器(apt-get/yum)默认安装,GO可执行命令在环境路径下,无须设置。 当用户编译安装,自由指定目录时,设置$GOROOT,并将其放入环境路径下。如/usr/local/go
,需将其插入PATH中:
1 | $ export GOROOT=/usr/local/go |
$GOPATH与标准工作区
提$GOPATH不得不提标准工作区。Golang的标准工作区不太简单,也不优雅。但一旦习惯,确实很实用。官网方描述如下:
A workspace is a directory hierarchy with three directories at its root:
src contains Go source files organized into packages (one package per directory), pkg contains package objects, and bin contains executable commands.
Golang工作区是一个包含有src
, bin
, pkg
三个目录的根路径。
$GOPATH指定了Golang的工作区。可以指定系统任意位置,如$HOME
, $HOME/work
。官方推荐:
1 | export GOPATH=$HOME |
注意,$GOPATH不能与$GOROOT一致。
属于$GOPATH的自由
虽然80%的情形,无须修改$GOPATH。但$GOPATH是一个环境变量,我们可以根据需求任意对其进行临时修改。而且对于某些场景,修改$GOPATH不失为一个好的临时解决方案:
场景一: git clone
当在文件系统任意位置git clone外部Golang项目后,只需临时修改$GOPATH即可快速运行
1 | $ git clone https://github.com/cloudfoundry/hm-workspace |
场景二: direnv
1 | $ git clone https://github.com/direnv/direnv |
$GOPATH是可以指定多个位置
1 | $ export GOPATH=$HOME:$HOME/workspace<:...> |
理解这层,可以很快地解决$GOPATH问题,即把所有需要用的内部外部依赖,均放到$GOPATH上。
对于开发环境,可以更灵活地运行实验项目。
对于生产环境,可以更好地解耦依赖,实现自动化。
1 | $ export GOPATH=$PWD:$PWD/Godep/_workspace go build -o $PWD/bin |
参考资料
https://golang.org/doc/code.html