共计 779 个字符,预计需要花费 2 分钟才能阅读完成。
}
解析,
^
字符,告诉 npm,安装主版本等于 4 的任意一个版本即可现在运行 npm 进行安装,npm 将安装 lodash 的主版本为 4 的最新版,可能 是 lodash@4.25.5(@是 npm 约定用来确定包名的指定版本的)
理论上,次版本号的变化并不会影响向后兼容性。因此,安装最新版的依赖库应该是能正常工作的,而且能引入自 4.17.4 版本以后的重要错误和安全方面的修复。
但是,即使不同的开发人员使用了相同的
package.json
文件,在他们自己的机器上也可能会安装同一个库的不同种版本,这样就会存在潜在的难以调试的错误和“在我的电脑上…”的情形。
大多数 npm 库都严重依赖于其他 npm 库,这会导致 嵌套依赖 关系,并增加无法匹配相应版本的几率。
虽然可以通过 npm config set save-exact true
命令关闭在版本号前面使用 ^
的默认行为,但这个 只会影响顶级依赖关系 。由于每个依赖的库都有自己的package.json
文件,而在它们自己的依赖关系前面可能会有 ^
符号,所以无法通过 package.json
文件为嵌套依赖的内容提供保证。
为了解决这个问题,npm 提供了 shrinkwrap
命令。此命令将生成一个 npm-shrinkwrap.json
文件,为所有库和所有嵌套依赖的库记录确切的版本。
然而,即使存在 npm-shrinkwrap.json
这个文件,npm 也只会锁定库的版本,而不是库的内容。即便 npm 现在也能阻止用户多次重复发布库的同一版本,但是 npm 管理员仍然具有强制更新某些库的权力。
这是引用自 shrinkwrap
文档的内容:
如果你希望锁定包中的特定字节,比如是为了保证能正确地重新部署或构建,那么你应该在源代码控制中检查依赖关系,或者采取一些其他的机制来校验内容,而不是靠校验
原文地址: 主流包管理工具 npm、yarn、cnpm、pnpm 之间的区别与联系——原理篇