最近我尝试用 Yarn 安装我的 Node 包。它工作得很好,而且比 NPM 快得多。纱线自动生成yarn.lock
. 我们已经有了 NPM 收缩包装 ( npm-shrinkwrap.json
)。
它们之间有什么区别吗?与 npm- shrinkwrap.jsonyarn.lock
相比有什么优势吗?
该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
,文档解释得很清楚:
它类似于 npm 的 npm-shrinkwrap.json,但它不是有损的,并且可以创建可重现的结果。
该文档还建议提交yarn.lock
到您的存储库,如果您还没有这样做,那么您可以获得一致且可重现的包解析的好处。这个问题还进一步解释了为什么你应该这样做。
的有损行为npm shrinkwrap
是由于其自身使用的非确定性算法所致npm
;正如另一个答案的评论中所述,npm shrinkwrap
>>npm install
不能npm shrinkwrap
保证产生与只进行一次收缩包装相同的输出,而 Yarn 明确使用“确定性和可靠的安装算法”。
它们之间有什么区别吗
与npm shrinkwrap
. 如果您使用 Yarn,继续使用收缩包装将违反直觉
您可以在以下文档中yarn.lock
找到:
它类似于 npm 的 npm-shrinkwrap.json,但它不是有损的,并且可以创建可重现的结果
然而,问题仍然存在,纱线是否已准备好生产。GitHub repo 上仍然存在许多明显的错误,所以我会等待一个月左右。