我的印象是该go
工具不鼓励“在每个项目的基础上维护同一个库的多个版本”,因为经验表明该策略不适用于大型代码库(例如 Google 的)。关于 golang-nuts 上的包版本控制已经有相当多的讨论:(搜索列表),并且似乎讨论仍然是开放的,正如 Ian Lance Taylor 在2013 年 6 月 6 日的采访中指出的那样(搜索单词“版本控制”)。
go
打包系统旨在让每个项目都有自己的目录结构;唯一的限制是它们都必须是GOPATH
. 这样做的好处是它可以与版本控制系统很好地交互,只要 VCS 主机始终构建。在上面提到的博客采访中,ILT 建议:
我们在内部做的是对导入的代码进行快照,并不时更新该快照。这样,如果 API 发生变化,我们的代码库就不会意外中断。
用“我的其他库”代替“导入的代码”,这似乎是一种可能;你可以有两个go
目录,生产和开发;对于开发,您可以将开发目录放在路径中的第一位,这样开发二进制文件和库就不会污染生产目录。我不知道这是否足够。
如果您真的想GOPATH
为每个项目单独设置一个,我建议您执行以下操作:
1)使每个项目的GOPATH
结束在一个名为go
(或类似)的目录
2)推断GOPATH
使用类似以下shell函数的东西(几乎完全未经测试):
gopath() {
GOPATH="$(
( while [[ $PWD != / && $(basename $PWD) != go ]]; do
cd ..
done
if [[ $PWD == / ]]; then
echo $GOPATH
else
echo $PWD
fi
))" go "$@"
}
然后,只要您当前的工作目录位于项目存储库中的某个位置,您就可以使用gopath
而不是。go
(更复杂的可能性可能包括使用明确提供的项目路径(如果有的话)来推断GOPATH
。)