【发布时间】:2017-11-11 19:34:55
【问题描述】:
我的简单问题是:为什么我不能在我的 package.json 中使用确切的版本?这与锁定文件有何不同?
【问题讨论】:
我的简单问题是:为什么我不能在我的 package.json 中使用确切的版本?这与锁定文件有何不同?
【问题讨论】:
主要区别在于锁文件还锁定嵌套的依赖项——你的依赖项的所有依赖项,等等。管理和跟踪所有这些更改可能非常困难,而且使用的软件包数量会呈指数级增长。
在某些情况下,您无法手动指定应使用特定版本的包 - 考虑 2 个库,它们分别在 ~1.0.0 和 ~2.0.0 指定 foo。主版本的差异告诉我们 foo@v1 的 API 不会匹配 foo@v2 的 API,因此您无法在应用级别覆盖包版本而不会导致冲突和失败。
最后,您可能想知道“为什么还要使用 semver?为什么不让所有包手动指定其依赖项的确切版本?” semver 的主要优点之一是它意味着您不必在子依赖项更新时更新树中的每个依赖项。如果我依赖于foo,而foo 依赖于bar,而bar 刚刚修复了一个严重错误,并且我们对所有内容都使用精确版本,那么foo 之前也必须更新我可以得到修复。如果 foo 和 bar 有不同的维护者,或者如果 foo 被放弃了,那可能需要一段时间,我可能需要分叉项目(我在 Java 领域做过不止一次的事情)。
这对于维护库的生态系统非常有用,因为它从根本上减少了依赖关系树中每个节点所需的维护工作量,从而更容易提取库和模式。我曾经有一个早期项目,我们正在构建一个使用精确版本的组件库,并且每当更新包含共享功能的核心库时,我们必须向每个其他包提交一个 PR更新版本,有时还会对依赖于那些的组件进行后续 PR。不用说,几个月后我们整合了这些软件包。
希望有帮助!
【讨论】: