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

Posted

技术标签:

【中文标题】yarn.lock 和 npm 的 shrinkwrap 有啥区别?【英文标题】:What is the difference between yarn.lock and npm's shrinkwrap?yarn.lock 和 npm 的 shrinkwrap 有什么区别? 【发布时间】:2017-02-24 17:31:40 【问题描述】:

最近我尝试使用 Yarn 安装我的 Node 包。它工作得很好,而且比 NPM 快得多。 Yarn 自动生成yarn.lock。我们已经有了 NPM 收缩包装 (npm-shrinkwrap.json)。

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

【问题讨论】:

【参考方案1】:

yarn.lock 文件与其他包管理器的锁文件非常相似,尤其是 Rust 的 Cargo 包管理器,它有 Cargo.lock。这些锁定文件的想法是代表一组应该始终工作的一致的包。

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

至于和npm shrinkwrap比较,the documentation解释的很清楚:

它类似于 npm 的 npm-shrinkwrap.json,但它不会有损并且可以创建可重现的结果。

该文档还建议将yarn.lock 提交到您的存储库,如果您还没有这样做,那么您可以获得一致且可重现的包解析的好处。 This question 还进一步解释了为什么要这样做。

npm shrinkwrap 的有损行为是由于npm 本身使用的非确定性算法造成的;如另一个答案的 cmets 所述,npm shrinkwrap > npm install > npm shrinkwrap 不能保证产生与仅收缩一次相同的输出,而 Yarn 明确使用 "an install algorithm that is deterministic and reliable"。

【讨论】:

我认为 npm-shrinkwrap 的目的是锁定依赖关系。你能解释一下 npm-shrinkwrap 如何/为什么是有损的吗? shrinkwrap docs 听起来好像没有损失:“最好递归地完全指定每个依赖项的每个版本,以便后续构建和部署不会无意中选择更新版本的依赖项满足 semver 模式" 试图想出一个比添加密码箱来挂钩一组软件包版本更简单的功能......但没有想出任何东西。我的意思是,您可以简单地过滤 package.json,剥离其范围字符,从而将版本固定到一个确切的数字。我称他为“缠结”。猫包.json |纠结 > package.pinned.json "关于与 npm shrinkwrap 的比较,文档解释得很清楚:它类似于 npm 的 npm-shrinkwrap.json,但它不会有损,并且可以创建可重现的结果。"不过,这根本不清楚。 Shrinkwrap 实际上并不是有损的,shrinkwrap 的全部目的是可重复性。这只是模糊和不正确的无法证实的说法。 NPM 文档中对package locks 的描述使得package-lock.json 在用途上听起来几乎与yarn.lock 相同。现在这只是 Yarn 有一个好主意而 NPM 已经实现它的一个案例吗?【参考方案2】:

它们之间有什么区别

npm shrinkwrap 相比,Yarn 遵循更具确定性的算法。如果您使用 Yarn,继续使用收缩包装将违反直觉

你可以在documentation for yarn.lock找到这个:

它类似于 npm 的 npm-shrinkwrap.json,但它不会有损并且可以创建可重现的结果

但是,问题仍然存在,纱线是否已准备好生产。 GitHub repo 上仍然存在许多明显的错误,所以我会等待一个月左右。

【讨论】:

为什么收缩包装是有损的? 这意味着 npm shrinkwrap > npm install > npm shrinkwrap 产生不同的 npm-shrinkwrap 文件,而不是最初的时间 有这种行为的证据吗?根据 NPM shrinkwrap 文档“运行不带参数的 npm install 只会重现现有的 shrinkwrap。” (参考:docs.npmjs.com/cli/shrinkwrap) @CurtisPatrick 来自 npm shrinkwrap 文档:If you wish to lock down the specific bytes included in a package, for example to have 100% confidence in being able to reproduce a deployment or build, then you ought to check your dependencies into source control, or pursue some other mechanism that can verify contents rather than versions. @taminov 这是否意味着唯一的区别是编译代码? npm shrinkwrap 将始终确定性地下载相同的源代码,但是任何需要编译的代码每次都会重新编译?纱线锁也编译二进制文件吗?

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

项目中的yarn.lock文件的作用

为啥我的项目同时有 package-lock.json 和 yarn.lock 文件?

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

yarn

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

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