Golang依赖pipe理最佳实践

在Golang中,我们可以在GitHub上指定开源库作为依赖关系。 例如:

import "github.com/RichardKnop/somelibrary" 

这将尝试寻找一个基于你的Go版本的分支,如果我理解正确的话,默认为master。

所以没有办法导入一个特定的依赖版本,例如:

 import "github.com/RichardKnop/somelibrary#v1.4.8" 

那么在Go中pipe理依赖项的最佳实践是什么?

我可以看到两种方法。

I.版本模块

是否为重大版本创build新的模块,并进行重大更改?

例如,我的Go库可以定义模块v1和v2,所以你可以这样做:

 import "github.com/RichardKnop/somelibrary/v1" 

要么:

 import "github.com/RichardKnop/somelibrary/v2" 

根据你的需要。 对v1或v2所做的任何更改都将不被要求破坏任何API或工作function。

II。 分叉

这将使您完全控制Go代码所需的外部依赖版本。

例如,您可以将github.com/RichardKnop/somelibrary分叉到您自己的GitHub帐户中,然后在您的代码中执行:

 import "github.com/ForkingUser/somelibrary" 

那么你将不得不fork所有的外部依赖这似乎有点矫枉过正。 但是它会让你完全控制版本。 您可以将您的叉子保留在您知道正在使用您的代码的版本中,并且只有在检查到新版本的依赖关系不会破坏任何东西后才更新叉子。

思考?

注意:2015年6月,第一次支持的出价出现在Go 1.5!

见c / 10923 / :

GO15VENDOREXPERIMENT=1在环境中时,此CL根据Go 1.5供应商build议更改导入path的分辨率:

  • 如果存在源目录d/vendor ,那么在以d为根的子树内编译源文件时, import "p"被解释为import "d/vendor/p"如果存在)。
  • 当有多种可能的解决scheme时,最具体(最长)的path会胜出。
  • 必须始终使用简写forms:没有导入path可以明确地包含“ /vendor/ ”。
  • 导入的评论在销售包中被忽略。

2016年1月更新:Go 1.6将使默认值成为首选。
正如在文章“大多数GO TOOLS现在使用GO15VENDOREXPIMIMENT”中详细描述的那样:

1.6支持/vendor/大多数工具(如oracle)开箱即用; 使用Beta来重build它们。

  • 问题12278已解决。
  • goimports还有一个问题 ,有一个CL 可以被选中

2015年8月版: Go 1.5带有一个内置的(但仍然是实验性的)销售支持。 设置环境variablesGO15VENDOREXPERIMENT将使go build和朋友在./vendor目录以及GOPATH查找包。 有关更多详细信息,请参阅VonC的答案和devise文档 。


III。 Vendoring

AFAIK,这是确保您的构build具有可重复性和可预测性的最广泛使用的方式。 Go团队在回购中使用了自助服务 。 Go团队正在讨论统一的依赖关系清单文件格式。 从Go工具链开发人员邮件列表中 :

在Google的内部源代码树中,我们将所有依赖关系供应(复制)到我们的源代码树中,并且最多只有任何给定外部库的一个副本。 我们有相当于只有一个GOPATH和重写我们的import指的是我们的商品副本。 例如,Google内部的Go代码想要使用“golang.org/x/crypto/openpgp”,而不是将其导入为“google / third_party / golang.org / x / crypto / openpgp”。

(……)

我们的build议是Go项目,

  • 正式推荐使用导入重写(不是GOPATH修改)作为引脚依赖关系的规范方式的“内部”目录。

  • 定义一个通用的configuration文件格式的依赖性和vendoring

  • 在Go 1.5中没有对cmd / go进行代码更改。 外部工具如“ godep ”或“ nut ”将执行1)和2)。 我们可以在Go 1.6+中重新评估这个工具。

也可能只是在maven中描述依赖关系,如果使用mvn-golang-wrapper ,在maven中就像下面的文本

 <plugin> <groupId>com.igormaznitsa</groupId> <artifactId>mvn-golang-wrapper</artifactId> <version>1.1.0</version> <executions> <execution> <id>golang-get</id> <goals> <goal>get</goal> </goals> <configuration> <packages> <package>github.com/gizak/termui</package> </packages> <buildFlags> <flag>-u</flag> </buildFlags> <goVersion>1.6</goVersion> </configuration> </execution> </plugin>