yarn.lock 和 npm 的 shrinkwrap 有什么区别?

What is the difference between yarn.lock and npm's shrinkwrap?

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

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

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

npm 将依赖项 运行ges 存储在 package.json 文件中,这意味着当有人安装您的软件包时,他们可能会获得一组与您不同的依赖项,因为您可能是 运行 过时的软件包(尽管它们仍然满足您指定的依赖性 运行ge)。举个例子,有人指定了依赖关系 "foo": "^1.0.0"。他们可能实际上已经安装了 foo v1.0.1,因为那是他们 运行 npm install 时的最新版本,但后来有人安装了您的软件包并获得了依赖项 foo v1.1.0。这可能会意外地破坏某些东西,如果你有一个 yarn.lock 文件 gua运行tees 一致的包解析.

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

It’s similar to npm’s npm-shrinkwrap.json, however it’s not lossy and it creates reproducible results.

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

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

Is there any difference between them

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

您可以在 documentation for yarn.lock:

中找到它

It’s similar to npm’s npm-shrinkwrap.json, however it’s not lossy and it creates reproducible results

然而,问题仍然是纱线是否已准备好投入生产。 GitHub 存储库中仍然存在大量明显的错误,所以我会等待一个月左右。