一尘不染

yarn.lock和npm的收缩包装有什么区别?

node.js

最近,我尝试使用Yarn安装Node软件包。它运作良好,并且比NPM快得多。纱线自动生成yarn.lock。我们已经有NPM收缩包装(npm- shrinkwrap.json)。

它们之间有什么区别吗?是否yarn.lock有过NPM-shrinkwrap.json什么优势?


阅读 367

收藏
2020-07-07

共1个答案

一尘不染

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

npm将依赖关系范围存储在package.json文件中,这意味着当有人安装您的软件包时,他们可能会获得与您不同的依赖关系集,因为您可能正在运行过时的软件包(尽管它们仍然满足您指定的依赖关系范围)。例如,某人指定了dependency"foo": "^1.0.0"。他们可能实际上已经安装了foo v1.0.1,因为这是他们运行时的最新npminstall版本,但是后来,有人安装了您的软件包并获得了依赖项foo v1.1.0。这可能会意外破坏某些内容,如果您有一个yarn.lock保证
一致的包解析度 的文件,可以避免这种情况。

至于与的比较npm shrinkwrap文档非常清楚地说明了这一点:

它类似于npm的npm-shrinkwrap.json,但是它不是有损的,并且可以产生可重复的结果。

该文档还建议yarn.lock您提交到存储库(如果您尚未这样做的话),这样您就可以从一致且可重复的包解析中受益。

的有损行为npm shrinkwrap是由于其npm自身使用的不确定性算法;作为另一个答案的评论指出,npm shrinkwrap> npminstall> npmshrinkwrap并不能保证产生输出作为刚刚shrinkwrapping一次,而纱线明确地使用相同“的安装算法是确定的,可靠的”

2020-07-07