默认情况下,如果无法找到对GOPATH的依赖关系,Go会通过获取master(github)或默认(mercurial)中的最新版本来提取导入的依赖项。虽然这个工作流程很容易掌握,但严格控制却变得有些困难。由于所有软件更改都会带来一些风险,因此我希望以可管理和可重复的方式降低此潜在更改的风险,并避免无意中获取依赖项的更改,尤其是在通过CI服务器运行完整版本或准备部署时。
我可以锁定(即锁定或捕获)包依赖项的最有效方法是什么,所以我发现自己无法重现旧包,甚至更糟糕的是,当我即将发布时意外破坏?
----更新----
Current State of Go Packaging的其他信息。虽然我最终(截至7.20.13)在第三方文件夹中捕获依赖关系并管理更新(ala Camlistore),但我仍然在寻找更好的方法......
Here is a great list of options
此外,请务必查看go 1.5 vendor/ experiment以了解将来版本中如何解决此问题。
答案 0 :(得分:8)
你可能会发现Camlistore有趣的方式。
请参阅third party directory,特别是update.pl
和rewrite-imports.sh
脚本。这些脚本更新外部存储库,必要时更改导入,并确保使用其余的camlistore代码签入静态版本的外部存储库。
这意味着camlistore具有完全可重复的构建,因为它是自包含的,但第三方组件可以在camlistore开发人员的控制下更新。
答案 1 :(得分:7)
有一个项目可以帮助您管理依赖项。查看gopack
答案 2 :(得分:3)
<强> godep 强>
我去年年初(2014年)开始使用godep并对此非常满意(它符合我在原始问题中提到的问题)。我不再使用自定义脚本来管理依赖关系的 vendoring ,因为godep会处理它。无论时间或机器的封装状态如何,都能确保不会引入漂移。它适用于go get
的现有机制,并引入了基于Godeps / godeps.json固定(godep save
)和恢复(godep restore
)的功能。
检查出来:
答案 3 :(得分:1)
此处没有内置工具。但是,您可以在本地磁盘或云服务中自行分配依赖项,并且只有在审核后才合并上游更改。
答案 4 :(得分:1)
第三方存储库完全在您的控制之下。 'go get'clones tip,你是对的,但是你可以自由检查克隆的每个克隆或克隆的存储库。只要你没有“去获取-u”,就没有任何东西可以触及已经存放在硬盘上的第三方存储库。
有效地,您的外部本地克隆依赖项默认始终锁定。