在
Go
工具链中,有一种安装和使用外部包的便捷方式。如果某个功能不在标准库中并且很常见,则可能有一个包,您可以轻松参考并使用
go get
安装,为您提供所需的东西。
但是,您使用的是哪个版本的软件包?它是一个稳定的版本吗?是否有带有错误修复或安全更新的更新版本?你怎么知道?
默认情况下你不知道
当您使用
go get
检索包时,它不会获得最新的标记版本。相反,它获取最新的代码。例如,如果您从 Github 获得一个默认分支为
master
的包,它将从
master
获取最新的提交。
你想要最新的提交还是最新的稳定版本?
包通过 HTTP 检索,提交引用、标记或其他信息不存储在本地。
为什么重要
关注您使用的版本有多种原因。这里仅仅是少数。
- 软件工程师使用多种开发风格。有些人会一直保持工作树处于良好的工作状态。其他人可能有一个通过所有测试的项目,但您应该只使用发布版。而且,其他人会不时损坏包裹。有时他们对此表示满意。发布是每个人都同意它是一个要使用的包的时刻。如果它不值得发布,它可能是 alpha 或 beta。你知道你得到了什么。
- 错误和安全问题的版本跟踪。你经常需要那个。您使用的版本是否存在安全问题?您遇到的错误是问题还是已在较新版本中修复?如果您不跟踪版本,您怎么知道?如果您为使用审计的组织工作,您将如何处理这些审计?
- API 重大变化发生在软件中。如果您使用的是 语义版本控制, 您知道您需要提升主要版本以表示更改。如果您不跟踪或引用版本,您如何管理这些版本?如果您暂时需要,如何安装以前的版本?
控制和跟踪版本的原因远不止这些。
供应商不能解决这个问题
在 Go 包对话中,我一直在讨论包处理的话题,经常变成关于是否供应商的话题。在这种情况下,您是否供应商并不重要。使用许多工具,包括
go get
,有或没有 vendoring 都不会帮助你确定你正在使用的包的版本。
哦工具
如果您使用过其他语言的工具,例如
pip
、
composer
、
npm
、
gem
、
bundler
或许多其他语言之一,您可能熟悉指定要使用的版本。虽然 Go 本身在使用
go get
时不处理版本,但还有其他工具可供您使用。
首先,许多这些工具增加了价值但不处理版本。例如 godep ,一种更流行的包管理器,会将修订保存为散列。但是,您最初安装什么版本来保存它?而且,如果您必须审核已安装的版本,您会知道您使用的是哪个标记、发布或以其他方式控制的版本吗?
最近流行的添加是
gb
。它有一些不错的功能和我计划融入我自己的工作的东西。如果您使用的是 gb,您知道您使用的是哪些项目的版本吗?有一个带有子命令的
gb vendor
命令,可以按标签、分支等进行安装。如果您必须审核其他人安装和销售的内容,您可以吗?此信息不在配置文件中。
我不是来批评的。我在这里提出这个问题,因为我希望每个人都考虑清楚并选择他们需要的正确控制级别。而且,每个人都会意识到他们需要的控制级别。对于不同的项目是不同的。
有一些工具可以让你控制你的包版本。我目前正在使用和开发类似于 npm、composer、pip 和其他类似工具的 glide 。还有其他几种工具也可以帮助解决这个问题。 Github 上的 Go 项目 wiki 有一个包管理器列表 。
我希望每个人从这篇文章中得到的一个收获是对包版本的认识以及他们管理它们的需求。