【发布时间】:2016-01-13 19:47:37
【问题描述】:
我开始接触 Go,虽然我理解并欣赏 Go 所基于的简单性原则,但我想了解放弃 背后的理由在他们的依赖获取工具go get和import语句中内置了包版本控制方法。
如果我理解正确,go get 和 import 从 HEAD 获取包,它们无法引用分支或标签。虽然有像gopkg.in 这样的工具可以绕过这个限制,但官方工具链:
- 强制开发人员为其产品的主要(破坏性)版本创建单独的存储库。
- 它不允许消费者在次要版本或微型版本之间降级,以防在较新版本中发现错误。
说实话,事情并不那么容易,因为包版本控制需要一种策略来处理冲突的传递依赖,例如X 依赖于A 和B,它们分别依赖于不同版本的C。
来自 Java 背景,这种限制似乎带来了一些风险和问题,其中包括:
产品/包的演变和第 3 方部门的公共 API 的破坏是不可避免的,因此版本控制必须是工具链中的一等公民恕我直言。
-
Git-repo-per-version 策略非常低效:
- 包的整体 Git 历史记录丢失或分散在存储库中(版本之间的合并、反向移植等)
- 可能仍会发生与传递依赖关系的冲突,并且会因为语言或工具链强加任何语义以首先允许检测而无法检测到。
-
企业采用可能会受到阻碍,开发团队可能会回避该语言,因为:
- 总是拖入
HEAD意味着他们无法控制或冻结他们的第 3 方部门,从而导致最终产品可能无法预测。 - 可能缺乏人力来不断更新产品并通过上游的
HEAD进行测试(并非世界上所有公司都是 Google :))。
- 总是拖入
虽然我明白后一种风险可以——而且必须——通过持续集成来缓解,但它并不能解决问题的根本原因。
我缺少什么信息?在人力有限的企业部署 Go 时如何处理包上游变更?
【问题讨论】:
-
您可以使用供应商进口。通过将
go get设计为从 HEAD 中提取,它可以更轻松地提取错误修复并迫使 API 开发人员更加注意向后不兼容的更改。也就是说,这显然是一个基于意见的问题,这不是 StackOverflow 的主题。 -
我明白了。我改变了措辞以避免基于意见的答案。如果您能详细说明供应商导入——或其他在企业中部署 Go 的策略,而无需处理不断的上游变化,我将不胜感激。
标签: go