我刚刚开始学习Go,并阅读现有代码以了解“别人如何做”。在这样做的时候,使用“工作空间”,特别是涉及到项目的依赖关系时,似乎遍布全球。Go工作空间的最佳实践是什么?
围绕使用单个或多个Go工作空间(即$ GOPATH的定义)在处理各种Go项目时常见的最佳实践是什么?我是否应该期待拥有一个Go工作空间,就像我所有项目的中央代码库一样,或者在我开始处理这些项目时设置$ GOPATH(有点像python的virtualenv)?
我刚刚开始学习Go,并阅读现有代码以了解“别人如何做”。在这样做的时候,使用“工作空间”,特别是涉及到项目的依赖关系时,似乎遍布全球。Go工作空间的最佳实践是什么?
围绕使用单个或多个Go工作空间(即$ GOPATH的定义)在处理各种Go项目时常见的最佳实践是什么?我是否应该期待拥有一个Go工作空间,就像我所有项目的中央代码库一样,或者在我开始处理这些项目时设置$ GOPATH(有点像python的virtualenv)?
我认为每个项目有一个$GOPATH
比较容易,这样你可以为不同的项目使用同一个软件包的不同版本,并根据需要更新软件包。
使用中央存储库时,很难更新软件包,因为这样做时可能会破坏不相关的项目(如果软件包更新有重大更改或新错误)。
实际上,我曾经使用过多个GOPATH--几十个。在项目之间切换和维护依赖关系要困难得多,因为在一个工作区中插入有用的更新需要我在其他项目中这样做,有时候我会忘记,并且挠头,想知道为什么依赖项在一个项目中起作用但不是另一个。惨败。
我现在只有一个 GOPATH和我实际上把我所有的开发项目 - 无论是否 - 在其中。有了一个中心工作区,我仍然可以将每个项目保存在自己的git存储库(src/<whatever>
)中,并在必要时使用git分支来管理依赖关系(实际上很少)。我建议:只使用一个工作空间,或者两个工作空间(例如,如果需要保留,例如工作和个人代码更加分离,尽管建议的软件包路径命名约定应该为你做)。
如果您只是将GOPATH
设置为$HOME/go
或类似的并开始工作,那么所有东西都可以直接使用,非常简单。
如果你在很多项目中制作了大量的bin dirs,这些项目有很多在新鲜度不同的状态下的共同依赖项,应该很明显,让自己变得更加困难。这只是更多的工作。
如果你发现有时需要隔离一些东西,那么你可以制作一个单独的GOPATH
来处理这种情况。
但是总的来说,如果你发现自己做了更多的工作,通常是因为你选择让事情变得更难。
我有什么必须接近我在过去四年积累的100个项目。我几乎总是在我的电脑上工作GOPATH
,即$HOME/go
。
在您的所有项目中使用一个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到〜/代码/我的项目,那么它使用的项目,而不是使用全球的依赖性中的相关性,一个和依赖性个的git子模块。
尝试envirius (universal virtual environments manager)。它允许编译任何版本的go
并基于它创建任意数量的环境。 $GOPATH
/$GOROOT
取决于每个特定的环境。
此外,它允许创建混合语言的环境(例如,在一个环境中的python
& go
)。
这看起来很棒! – CESCO
只需使用GoSwitch。节省了大量的时间和精力。 将脚本添加到每个项目的根目录并将其来源。 它将使该项目dir您的gopath,并将该项目的确切bin文件夹添加/删除到路径。 https://github.com/buffonomics/goswitch
在我的公司,我创建了Virtualgo,使管理多个GOPATH
超级简单。一对夫妇超过处理它的优点是手动:
GOPATH
当你cd
到项目中。GOPATH
作为备份。如果在项目特定工作区中找不到包,它将搜索主要的GOPATH
。One workspace + godep对我来说是最好的选择。
这仍然是围绕Go社区的一个重要问题,目前还没有确切的答案来解决这个问题。 – jrefior