【发布时间】:2017-02-24 17:31:40
【问题描述】:
最近我尝试使用 Yarn 安装我的 Node 包。它工作得很好,而且比 NPM 快得多。 Yarn 自动生成yarn.lock。我们已经有了 NPM 收缩包装 (npm-shrinkwrap.json)。
它们之间有什么区别吗?
yarn.lock 比 npm-shrinkwrap.json 有什么优势吗?
【问题讨论】:
最近我尝试使用 Yarn 安装我的 Node 包。它工作得很好,而且比 NPM 快得多。 Yarn 自动生成yarn.lock。我们已经有了 NPM 收缩包装 (npm-shrinkwrap.json)。
它们之间有什么区别吗?
yarn.lock 比 npm-shrinkwrap.json 有什么优势吗?
【问题讨论】:
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"。
【讨论】:
package-lock.json 在用途上听起来几乎与yarn.lock 相同。现在这只是 Yarn 有一个好主意而 NPM 已经实现它的一个案例吗?
它们之间有什么区别
与npm shrinkwrap 相比,Yarn 遵循更具确定性的算法。如果您使用 Yarn,继续使用收缩包装将违反直觉
你可以在documentation for yarn.lock找到这个:
它类似于 npm 的 npm-shrinkwrap.json,但它不会有损并且可以创建可重现的结果
但是,问题仍然存在,纱线是否已准备好生产。 GitHub repo 上仍然存在许多明显的错误,所以我会等待一个月左右。
【讨论】:
npm shrinkwrap > npm install > npm shrinkwrap 产生不同的 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.