我应该提交Godeps / _workspace还是Godeps.json?

时间:2014-10-13 06:38:16

标签: git heroku go dependencies

我正在Go中编写一个项目部署在heroku上,使用godep管理依赖项。

当我godep save时,我得到一个Godeps.json文件列出我的版本依赖项和一个_workspace/目录,其中包含所有依赖项的源代码。我宁愿不提交{ {1}},所有代码已经在其他地方的github上了。似乎_workspace具有我们在heroku buildpack时间Godeps.json版本锁定依赖项所需的所有信息。

Several sources建议提交完整的go get目录,但其他人建议might not be necessary

godep文档帮助不大:

  

这将保存文件Godeps / Godeps.json的依赖项列表,并将其源代码复制到Godeps / _workspace中。阅读其内容并确保其合理。然后将文件提交到版本控制。

Godeps.json 文件

3 个答案:

答案 0 :(得分:18)

官方回答:

来自GitHub问题#131

  

godep的预期用途是供应商依赖项,并将_workspace目录提交给版本控制。请参阅#123中链接的@kr提案文档(提案:http://goo.gl/RpYs8e)正如该提案中所讨论的,godep曾经有一种支持不销售依赖关系的模式(-copy = false)。我的猜测是自述文件中含糊不清的语言可能是由于这一点。此模式已被删除,如#123中所述。

此处还有godep作者在谈论他的项目和想法 - Vendoring and Import Path Rewriting

个人观点:

我认为没有正确的方法可以做到这一点。

提交供应商库似乎很尴尬,但它有它的优点:

  • 您不依赖外部服务(GitHub等)。 GitHub有中断,也许你有一些可怕的公司政策阻止你使用它,可能存储库消失或者它的历史被重写,也许你已经在防火墙(登台/构建服务器)之后等等。
  • 每次有你的deps更新时,你都会得到一个很好的差异。 这有助于更新到更新版本,或者只是在屏幕显示正在使用的代码时跟踪更改。

最后,您可以权衡利弊。我个人每次都要提交供应商代码时都会畏缩,但在我的Go项目中我会这样做。至少现在。

Google和Facebook这样的公司大多将所有内容保存在一个存储库中,其中包含供应商代码(或者我已经听过)。

有关该主题的有趣文章:  Go Package Management

答案 1 :(得分:2)

godep需要json文件才能回读依赖关系,如update.go所示。
因此该文件需要进行版本控制。

但是godep would fill the content of godep/_workspace,这意味着它是"生成的"内容:您不需要对其进行版本化。

答案 2 :(得分:2)

只需将Godeps.json文件添加到repo,将_workspace添加到.gitignore列表:)。

虽然你的代码应该完全包含在你的repo中,但依赖关系必须以某种方式引用(godep.json,package.json,git submodule ......你选择),仅此而已。 同样的策略适用于npm,bower,apt和所有其他包管理器。

您的回购 - 您的东西+对供应商库的引用(当然,如果可能,您不能引用sourceforge zip文件)。

正如@VonC所说,我们不想对供应商库进行版本化。