我刚开始学习Go,并通过现有代码阅读以了解"其他人是如何做到的".在这样做时,使用go"工作区",特别是当它与项目的依赖关系相关时,似乎到处都是.
在处理各种Go项目时,使用单个或多个Go工作区(即$ GOPATH的定义)的常见最佳实践是什么(或有没有)?我是否应该期望有一个Go工作区,它有点像我所有项目的代码的中央存储库,或者在我开始处理这些项目时明确地分解并设置$ GOPATH(有点像python的virtualenv)?
我认为$GOPATH
每个项目更容易一个,这样你就可以为不同的项目提供相同包的不同版本,并根据需要更新包.
使用中央存储库时,很难更新程序包,因为在执行此操作时可能会破坏不相关的项目(如果程序包更新有重大更改或新错误).
在所有项目中使用一个GOPATH非常方便,但我发现这只是我个人项目的情况.
我为我维护的每个生产系统使用单独的GOPATH,因为我在每个GOPATH的目录树中使用git子模块来冻结依赖关系.
所以,像:
~/code/my-project - src - github.com + dependency-one + dependency-two - my-org - my-project * main.go + package-one + package-two - pkg - bin
通过将GOPATH设置为〜/ code/my-project,它使用该项目中的dependency-one和dependency-two git子模块,而不是使用全局依赖项.
如果您设置GOPATH
为$HOME/go
或类似并开始工作,那么一切都将立即可用并且非常容易。
如果您GOPATH
为很多项目创建了很多s,带有很多bin dirs,这些项目在不同的新鲜度状态下都有很多共同的依赖项,那么您就会变得很困难,这很明显。那只是更多的工作。
如果您发现有时需要隔离某些内容,则可以单独GOPATH
进行处理。
但是总的来说,如果您发现自己要做更多的工作,通常是因为您选择让事情变得更艰难。
在过去的四年中,我已经完成了100个项目,现在必须要做的事情。我几乎一直在工作GOPATH
,这是$HOME/go
我的电脑。
事实上,我曾经使用过多个GOPATHs - 几十个.在项目之间切换和维护依赖项要困难得多,因为在一个工作区中引入一个有用的更新需要我在其他工作区中执行它,有时候我会忘记,并且抓住我的脑袋,想知道为什么这个依赖项在一个项目中工作但不是另一个.惨败.
我现在只有一个 GOPATH,我实际上把我所有的开发项目 - Go or not - 放在其中.有了一个中央工作区,我仍然可以将每个项目保存在自己的git repository(src/<whatever>
)中,并在必要时使用git分支来管理依赖项(实际上很少).
我的建议:只使用一个工作区,或者只使用两个工作区(例如,如果你需要保持工作和个人代码更加独立,尽管推荐的包路径命名约定应该为你做).
在我的公司中,我创建了Virtualgo来使管理多个GOPATH
s超级容易。与手动处理相比,有两个优点:
GOPATH
当您cd
进入项目时,将自动切换到正确的位置。
它与供应商工具很好地集成
它还会在您的路径中设置新的GOBIN,因此您可以使用在那里安装的可执行文件。
它仍然有您的原件GOPATH
作为备份。如果在项目特定的工作区中找不到包,它将搜索main GOPATH
。
试试envirius(通用虚拟环境管理器).它允许编译任何版本go
并基于它创建任意数量的环境.$GOPATH
/ $GOROOT
取决于每个特定的环境.
此外,它允许创建具有混合语言环境(例如,python
与go
在一个环境中).