我开始接触 Go,虽然我理解并欣赏Go 所基于的简单原则,但我想了解在他们的依赖获取工具中放弃内置包版本控制方法背后的基本原理go get
和该import
声明。
如果我理解正确,go get
并import
从中获取包HEAD
,他们将无法引用分支或标签。虽然有像gopkg.in这样的工具可以绕过这个限制,但官方工具链:
强制开发人员为其产品的主要(破坏性)版本创建单独的存储库。
它不允许消费者在小版本或微型版本之间降级,以防在较新的版本中发现错误。
说实话,事情并没有那么容易,因为包版本控制需要一种策略来处理冲突的传递依赖关系,例如X
依赖A
和B
,每个依赖于不同版本的C
.
从 Java 背景来看,这个限制确实带来了一些风险和问题,其中包括:
产品/包的演变和 3rd 方 deps 公共 API 的损坏是不可避免的,因此版本控制必须是工具链中的一等公民恕我直言。
在Git的回购每版的政策是非常低效的:
包的整体 Git 历史丢失或分散在存储库中(版本、向后移植等之间的合并)
与传递依赖的冲突可能仍然会发生,并且不会被检测到,因为语言和工具链首先强加了任何允许检测的语义。
鉴于以下情况,企业采用可能会受到阻碍,开发团队可能会回避该语言:
总是拖延HEAD
意味着他们无法控制或冻结他们的第 3 方部门,从而导致可能无法预测的最终产品。
可能缺乏人力来保持他们的产品不断更新和与上游的测试HEAD
(并非世界上的每家公司都是谷歌:))。
虽然我确实理解后一种风险可以——而且必须——通过持续集成来减轻,但它并没有解决问题的根本根源。
我缺少什么信息?在人力有限的企业中部署 Go 时,如何处理包上游变化?
浮云间
天涯尽头无女友
相关分类