yarn/npm5 锁文件和确切的包版本之间的区别?
Difference between yarn/npm5 lockfiles and exact package versions?
我的简单问题是:为什么我不能在 package.json 中使用准确的版本?这与锁定文件有何不同?
主要区别在于锁定文件还锁定嵌套依赖项 - 您的依赖项的所有依赖项,等等。管理和跟踪所有这些更改可能非常困难,而且使用的软件包数量可能呈指数级增长。
在某些情况下,您无法手动指定应使用特定版本的包 - 考虑分别在 ~1.0.0
和 ~2.0.0
处指定 foo
的 2 个库。主要版本的差异告诉我们,foo@v1 的 API 不会与 foo@v2 的 API 匹配,因此您无法在应用程序级别覆盖包版本而不会导致冲突和失败。
最后,您可能想知道 "why have semver at all then? Why not just have all packages manually specify the exact version of their dependencies?" semver 的主要优点之一是它意味着您不必在子依赖项更新时更新树中的每个依赖项。如果我依赖 foo
,而 foo
依赖 bar
,并且 bar
刚刚修复了一个严重的错误,并且我们对所有内容都使用了精确的版本,那么foo
也必须更新才能得到修复。如果 foo 和 bar 有不同的维护者,或者如果 foo 被放弃,那可能需要一段时间,我可能需要 fork 这个项目(我在 Java-land 做过不止一次)。
这对于维护库生态系统非常有用,因为它从根本上减少了依赖树中每个节点所需的维护工作量,从而更容易提取库和模式。我曾经有一个早期的项目,我们正在构建一个使用精确版本的组件库,并且每当更新包含共享功能的核心库时,我们都必须向 each 提交 PR其他软件包来更新版本,有时还会对依赖于 those 的组件进行后续 PR。不用说,我们在几个月后整合了包裹。
希望对您有所帮助!
我的简单问题是:为什么我不能在 package.json 中使用准确的版本?这与锁定文件有何不同?
主要区别在于锁定文件还锁定嵌套依赖项 - 您的依赖项的所有依赖项,等等。管理和跟踪所有这些更改可能非常困难,而且使用的软件包数量可能呈指数级增长。
在某些情况下,您无法手动指定应使用特定版本的包 - 考虑分别在 ~1.0.0
和 ~2.0.0
处指定 foo
的 2 个库。主要版本的差异告诉我们,foo@v1 的 API 不会与 foo@v2 的 API 匹配,因此您无法在应用程序级别覆盖包版本而不会导致冲突和失败。
最后,您可能想知道 "why have semver at all then? Why not just have all packages manually specify the exact version of their dependencies?" semver 的主要优点之一是它意味着您不必在子依赖项更新时更新树中的每个依赖项。如果我依赖 foo
,而 foo
依赖 bar
,并且 bar
刚刚修复了一个严重的错误,并且我们对所有内容都使用了精确的版本,那么foo
也必须更新才能得到修复。如果 foo 和 bar 有不同的维护者,或者如果 foo 被放弃,那可能需要一段时间,我可能需要 fork 这个项目(我在 Java-land 做过不止一次)。
这对于维护库生态系统非常有用,因为它从根本上减少了依赖树中每个节点所需的维护工作量,从而更容易提取库和模式。我曾经有一个早期的项目,我们正在构建一个使用精确版本的组件库,并且每当更新包含共享功能的核心库时,我们都必须向 each 提交 PR其他软件包来更新版本,有时还会对依赖于 those 的组件进行后续 PR。不用说,我们在几个月后整合了包裹。
希望对您有所帮助!