yarn.lock 和 npm 的 package-lock 有啥区别?

Posted

技术标签:

【中文标题】yarn.lock 和 npm 的 package-lock 有啥区别?【英文标题】:What is the difference between yarn.lock and npm's package-lock?yarn.lock 和 npm 的 package-lock 有什么区别? 【发布时间】:2017-12-07 10:03:05 【问题描述】:

我不小心在一个使用 Yarn 的项目中运行了npm install,并注意到 npm 创建了一个package-lock.json 文件。

我知道 Yarn 受欢迎的部分原因是它使用锁文件来生成比 npm 更可靠和确定性的依赖安装,npm 有一段时间只有一个残废的shrinkwrap feature,但现在我不知道该做什么关于这个 npm 锁定文件业务,以及继续使用 Yarn 是否有什么令人信服的地方。

因此,本着previous Q and A on *** on yarn vs shrinkwrap 的精神,我提出以下问题:

这两个包管理器在可靠性方面是否存在任何实质性差异? 如果没有,除了“更多表情符号。????”之外,还有什么令人信服的理由继续使用 Yarn?

【问题讨论】:

yarnpkg.com/blog/2017/05/31/determinism 可能会有所帮助。看起来 npm 5 在这方面几乎达到了与 yarn 的同等水平。 【参考方案1】:

在纸面上,Yarn 和 NPM 5 看起来几乎相同。它们都具有确定性锁定文件,并且在功能上几乎相互匹配。有人会说 Yarn 是 NPM 创新的催化剂。

但是,在体验了 NPM 5 一个月后,我的团队决定迁移到 Yarn。

NPM 在技术上具有“更具确定性”的锁定文件,因为理论上可以保证跨 NPM 版本,NPM 将生成完全相同的node_modules 文件夹。另一方面,Yarn 对依赖项的确切提升/排序取决于 Yarn 版本,并且可能会随着 Yarn 版本而改变。一般来说,这几乎没有影响。

那为什么要使用 Yarn?合并和可靠性。

Yarn 做出了轻微的确定性权衡,以实现更简单的yarn.lock 文件,更容易合并。如果你是一个单独的开发者,这可能不会影响你,但如果你在一个有多个协作者提交依赖项更改的团队中,它很快就会成为一个大问题。 NPM 的package-lock 实际上是不可合并的,你最终不得不重新生成或挣扎。另一方面,使用 Yarn,合并变得容易且可预测。

见:https://yarnpkg.com/blog/2017/05/31/determinism/

附带说明,我们还发现 Yarn 平均而言更可靠。

【讨论】:

关于合并,我不知道我是否同意使用 yarn.lock 这样做的“简单性”。几周前我遇到了这个问题,发现了这个对话,它基本上说,你应该再生,但要以特定的方式去做。 github.com/yarnpkg/yarn/issues/1776#issuecomment-269539948 我的经验基本上与这个答案相反,所以我认为这主要是个人意见。合并yarn.lock 基本上是不可能的,因为不同的开发人员获得了截然不同的锁定文件。 @jktravis 建议的工作流似乎是 Yarn 和 NPM 锁定文件的唯一可靠方法,两者大致相同。这个答案似乎并没有真正给出任何具体的答案,但链接很有趣。

以上是关于yarn.lock 和 npm 的 package-lock 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

关于package.json package-lock.json 和 yarn.lock 的安装问题

关于package.json package-lock.json 和 yarn.lock 的安装问题

我应该提交 yarn.lock 和 package-lock.json 文件吗?

如何将`yarn.lock`与`package.json`同步?

yarn

yarn.lock 和 npm 的 shrinkwrap 有啥区别?