原文链接
原文作者:Herbert Fischer
译者:xcshuan
通常我的机器里只有一个GOPATH,这也是大多数Gophers推荐的方案。然而,有时我们需要处理具有相同依赖关系的不同版本的不同项目,并且准确地更新它们。我们只是不想破坏正在工作的东西,或者将它们弄得一团糟。
快速解决方案是先将GOPATH指向其他地方,但是每次我们交换要做的项目时,都需要再次更改它。
所以我刚刚想出了一个简单的解决方案,它可以在使用bash的命令行中使用,并且也可以适用于其他shell。由于我是VIM用户,所以这个方案工作得很好。但我不推荐这种方法用于Sublime Text或其他任何使用自有方法来设置GOPATH的IDE。除非你每次都从相同的命令行shell来加载编辑器/IDE,而且这个IDE不用自己的方式来设置GOPATH,否则这个方案将无法工作。
解决方法很简单。只需在~/.bashrc(或~/.bash_profile)(注:.zshrc也可以)中包括以下代码片段,然后用source ~/.bashrc重载配置文件即可。这个片段将创建一个shell函数,该函数将使用定制命令cd覆盖内置命令cd,定制命令cd扫描所在目录,并扫描上级目录来找一个名为.gopath的文件。
cd () {
builtin cd "$@"
cdir=$PWD
while [ "$cdir" != "/" ]; do
if [ -e "$cdir/.gopath" ]; then
export GOPATH=$cdir
break
fi
cdir=$(dirname "$cdir")
done
}
现在,您只需要在每个希望作为GOPATH的目录下创建.gopath文件,那么每次进入这个目录时,重新定义的cd函数会将当前环境的GOPATH设置为该目录。
例如,让我们创建两个目录A和B,每个都有一个子目录src,以充分说明解决方案。
$ go env GOPATH
/home/user/Go
$ mkdir -p ~/A/src && touch ~/A/.gopath
$ mkdir -p ~/B/src && touch ~/B/.gopath
$ cd ~/A/src
$ go env GOPATH
/home/user/A
$ cd ~/B/src
$ go env GOPATH
/home/user/B
没啥毛病,不过我现在想要原来的GOPATH了。
$ cd /home/user/Go
$ go env GOPATH
/home/user/B
emmmm,我们还需要在这里建立一个.gopath。
$ touch /home/user/Go/.gopath
$ cd .
$ go env GOPATH
/home/user/Go
完全没毛病了,一个不需要任何外部依赖的简单GOPATH管理方案闪亮登场。