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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的项目同时有 package-lock.json 和 yarn.lock 文件?
我应该提交 yarn.lock 和 package-lock.json 文件吗?