2013-12-21 35 views
29

我刚刚开始学习Go,并阅读现有代码以了解“别人如何做”。在这样做的时候,使用“工作空间”,特别是涉及到项目的依赖关系时,似乎遍布全球。Go工作空间的最佳实践是什么?

围绕使用单个或多个Go工作空间(即$ GOPATH的定义)在处理各种Go项目时常见的最佳实践是什么?我是否应该期待拥有一个Go工作空间,就像我所有项目的中央代码库一样,或者在我开始处理这些项目时设置$ GOPATH(有点像python的virtualenv)?

+0

这仍然是围绕Go社区的一个重要问题,目前还没有确切的答案来解决这个问题。 – jrefior

回答

24

我认为每个项目有一个$GOPATH比较容易,这样你可以为不同的项目使用同一个软件包的不同版本,并根据需要更新软件包。

使用中央存储库时,很难更新软件包,因为这样做时可能会破坏不相关的项目(如果软件包更新有重大更改或新错误)。

+3

同意。由于Go没有办法跟踪包装版本,如Ruby Bundler或Node package.json,这意味着保持每个项目的每个包的副本是保持一定稳定性的唯一方法。 – Alkaline

+0

请记住,通过部署编译的二进制文件(或者在$ GOPATH/bin之外复制它们),您可以实现*运行时稳定性,这些文件通常在Go中静态链接。 – eold

+0

你应该试试[Virtualgo](https://github.com/GetStream/vg)。它使得为每个项目管理一个'GOPATH'非常容易。看到我的答案下面的一些优势。 – JelteF

25

实际上,我曾经使用过多个GOPATH--几十个。在项目之间切换和维护依赖关系要困难得多,因为在一个工作区中插入有用的更新需要我在其他项目中这样做,有时候我会忘记,并且挠头,想知道为什么依赖项在一个项目中起作用但不是另一个。惨败。

我现在只有一个 GOPATH和我实际上把我所有的开发项目 - 无论是否 - 在其中。有了一个中心工作区,我仍然可以将每个项目保存在自己的git存储库(src/<whatever>)中,并在必要时使用git分支来管理依赖关系(实际上很少)。我建议:只使用一个工作空间,或者两个工作空间(例如,如果需要保留,例如工作和个人代码更加分离,尽管建议的软件包路径命名约定应该为你做)。

2

如果您只是将GOPATH设置为$HOME/go或类似的并开始工作,那么所有东西都可以直接使用,非常简单。

如果你在很多项目中制作了大量的bin dirs,这些项目有很多在新鲜度不同的状态下的共同依赖项,应该很明显,让自己变得更加困难。这只是更多的工作。

如果你发现有时需要隔离一些东西,那么你可以制作一个单独的GOPATH来处理这种情况。

但是总的来说,如果你发现自己做了更多的工作,通常是因为你选择让事情变得更难。

我有什么必须接近我在过去四年积累的100个项目。我几乎总是在我的电脑上工作GOPATH,即$HOME/go

6

在您的所有项目中使用一个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子模块。

4

尝试envirius (universal virtual environments manager)。它允许编译任何版本的go并基于它创建任意数量的环境。 $GOPATH/$GOROOT取决于每个特定的环境。

此外,它允许创建混合语言的环境(例如,在一个环境中的python & go)。

+0

这看起来很棒! – CESCO

-1

只需使用GoSwitch。节省了大量的时间和精力。 将脚本添加到每个项目的根目录并将其来源。 它将使该项目dir您的gopath,并将该项目的确切bin文件夹添加/删除到路径。 https://github.com/buffonomics/goswitch

2

在我的公司,我创建了Virtualgo,使管理多个GOPATH超级简单。一对夫妇超过处理它的优点是手动:

  • 自动切换到正确的GOPATH当你cd到项目中。
  • 它与销售工具集成得很好
  • 它还在您的路径中设置新的GOBIN,因此您可以使用安装在那里的可执行文件。
  • 它仍然有你原来的GOPATH作为备份。如果在项目特定工作区中找不到包,它将搜索主要的GOPATH
0

One workspace + godep对我来说是最好的选择。

相关问题