在Golang中锁定外部依赖"版本"的最有效方法是什么?

Mat*_*elf 22 go

默认情况下,如果无法找到对GOPATH的依赖关系,Go会通过获取master(github)或默认(mercurial)中的最新版本来提取导入的依赖项.虽然这个工作流程很容易掌握,但严格控制却变得有些困难.由于所有软件更改都会带来一些风险,因此我希望以可管理且可重复的方式降低此潜在更改的风险,并避免无意中获取依赖项的更改,尤其是在通过CI服务器运行干净构建或准备部署时.

什么是我可以锁定(即锁定或捕获)包依赖的最有效方式,所以我发现自己无法重现旧包,或者更糟糕的是,当我即将发布时意外破坏?

----更新----

关于当前包装状态的其他信息.虽然我最终(截至7.20.13)捕获第三方文件夹中的依赖项并管理更新(ala Camlistore),但我仍然在寻找更好的方法......

这是一个很好的选项列表.

此外,请务必查看go 1.5供应商/实验,以了解在未来版本中如何处理该问题.

Nic*_*ood 8

你可能会发现Camlistore有趣的方式.

请参阅第三方目录,特别是update.plrewrite-imports.sh脚本.这些脚本更新外部存储库,必要时更改导入,并确保使用其余的camlistore代码签入静态版本的外部存储库.

这意味着camlistore具有完全可重复的构建,因为它是自包含的,但第三方组件可以在camlistore开发人员的控制下更新.


shi*_*ara 7

有一个项目可以帮助您管理依赖项.检查gopack


Mat*_*elf 5

戈德普

年初(2014 年)开始使用godep并且对它非常满意(它满足了我在最初的问题中提到的问题)。我不再使用自定义脚本来管理vendoring依赖作为godep只是需要照顾它。无论时间或机器的封装状态如何,它都非常适合确保不会引入漂移。它与现有的机制一起工作,go get并引入了基于 Godeps/godeps.json 的pin ( godep save) 和 restore ( godep restore) 的能力。

一探究竟:

https://github.com/tools/godep