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

Fiz*_*han 53 node.js npm yarnpkg

最近我尝试用Yarn安装我的Node包.它运行良好,比NPM快得多.纱线自动生成yarn.lock.我们已经有了NPM shrinkwrap(npm-shrinkwrap.json).

它们之间有什么区别吗?是否yarn.lock有过NPM-shrinkwrap.json什么优势?

Aur*_*001 50

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并不能保证产生输出作为刚刚shrinkwrapping一次,而纱线明确地使用相同"的安装算法是确定的,可靠的".

  • 我认为npm-shrinkwrap的目的是锁定依赖项.你能解释为什么/为什么npm-shrinkwrap有损? (10认同)
  • "至于与npm shrinkwrap的比较,文档非常清楚地解释了它:它类似于npm的npm-shrinkwrap.json,但它不是有损的,它可以产生可重复的结果." 但这根本不清楚.收缩包装实际上并不是有损耗的,而收缩包装的整个目的是可重复性.这只是模糊和不正确的无法核实的主张. (7认同)
  • NPM文档中[package locks](https://docs.npmjs.com/files/package-locks)的描述使得`package-lock.json`声音在目的方面几乎与`yarn.lock`完全相同.现在这只是Yarn有一个好主意并且NPM现在实现它的情况吗? (3认同)
  • [shrinkwrap docs](https://docs.npmjs.com/cli/shrinkwrap)听起来好像没有损失:"希望以递归方式完全指定每个依赖项的每个版本,以便后续构建和部署不会无意中选择满足semver模式的新版本的依赖项" (2认同)

nik*_*ohn 5

他们之间有什么区别吗?

与之相比,纱线遵循更确定的算法npm shrinkwrap.如果您正在使用Yarn,继续使用shrinkwrap会违反直觉

您可以在以下文档中yarn.lock找到:

它类似于npm的npm-shrinkwrap.json,但它不是有损的,它可以产生可重复的结果

然而,问题仍然是纱线是否已准备就绪.在GitHub回购中还有一堆明显的错误,所以我会等一个月左右.

  • 这是否意味着收缩包装有损? (7认同)
  • 有这种行为的证据吗?根据NPM shrinkwrap文档"运行没有参数的npm安装只会重现现有的收缩包装".(参考:https://docs.npmjs.com/cli/shrinkwrap) (5认同)
  • @taminov这是否意味着唯一的区别是编译代码?Npm shrinkwrap将始终确定地下载相同的源,但是每次需要编译的代码都会被重新编译?纱线锁定编译的二进制文件吗? (2认同)