yarn.lock和npm shrinkwrap有什么区别?

最近我尝试用纱线安装我的节点包。 它工作的很好,比NPM快很多。 yarn自动产生yarn.lock 。 我们已经有了NPM shrinkwrap( npm-shrinkwrap.json )。

他们之间有什么区别? yarn.lock比npm- yarn.lock有什么优势吗?

yarn.lock文件与其他软件包pipe理器的锁文件非常相似,尤其是Rust的Cargo包pipe理器,它具有Cargo.lock 。 这些锁文件的想法是代表一套始终有效的软件包。

npmpackage.json文件中存储依赖范围,这意味着当有人安装你的包时,他们可能会得到一组不同的依赖关系,因为你可能正在运行过时的包(尽pipe它们仍然满足你指定的依赖范围)。 以例如指定依赖项"foo": "^1.0.0"人为例"foo": "^1.0.0" 。 他们实际上可能已经安装了foo v1.0.1,因为这是最新的,当他们运行npm install ,但稍后有人会安装你的软件包并获得依赖关系foo v1.1.0。 这可能会意外地破坏一些东西,如果你有一个yarn.lock文件,它可以保证一致的包parsing度 ,这是可以避免的。

至于与npm shrinkwrap比较, 文件非常清楚地解释:

这与npm的npm-shrinkwrap.json类似,但是它不是有损的,它会产生可重现的结果。

如果你还没有这样做,那么这个文档还build议把yarn.lock提交给你的仓库,这样你就可以享受到一致的,可重复的包装解决scheme的好处。 这个问题也解释了为什么你应该这样做。

npm shrinkwrap的有损行为是由npm本身使用的非确定性algorithm造成的; 如另一个答案的注释中所述, npm shrinkwrap > npm install > npm shrinkwrap不能保证产生与只收缩一次相同的输出,而Yarn明确地使用“确定性和可靠性的安装algorithm” 。

他们之间有什么区别吗?

npm shrinkwrap相比,纱线遵循更确定的algorithm。 如果你使用Yarn,继续使用shrinkwrap将是违反直觉的

你可以在yarn.lock的文档中find它:

这与npm的npm-shrinkwrap.json类似,但是它不是有损的,它会产生可重现的结果

然而,纱线是否已经准备就绪仍然存在。 在GitHub仓库中仍然有一些明显的漏洞,所以我会等待一个月左右。