为什么在 package.json 中增加版本后 运行 纱线安装时我的 yarn.lock 文件发生变化?

Why is my yarn.lock file changing when running yarn install after incrementing version in package.json?

我已经通读了有关 yarn 命令和 yarn.lock 的文档,我被引导相信 yarn.lock 文件的全部意义在于使用该文件中指定的版本。

我很好奇的是:yarn.lock中指定的版本是什么时候实际使用的?我在 package.json 中手动更改了一个包的版本,然后重新运行 yarn install,yarn.lock 文件已更新为使用新版本。我以为它会被锁定,所以在 package.json 中指定什么新版本并不重要,只要 yarn.lock 为那个包指定了一个版本,它就会使用那个旧版本。

如果这就是 yarn.lock 应该如何工作,那么为什么不在 package.json 中指定确切的版本,而不是在版本号前面使用 ~ 或 ^。现在我必须这样做,以便在 运行 yarn install 时不更改 yarn.lock 文件。

那么锁定版本什么时候才是真正的 used/is 这是使用 yarn.lock 的正确方法?

如果您更改 package.json 中的依赖版本,锁定文件将被更新以反映这一点。锁定文件的目的有两个。第一,允许您(和您的同行)使用您知道可以工作并且已经过测试的依赖项版本。第二,依赖作者指定要使用的依赖项的依赖项版本。这里的目标是稳定。

如果您想尝试并了解锁定文件的用途,请创建一个您自己的 npm 模块并将其推送到带有 v1.0.0 的 npm 注册表。然后在您的项目中,将此模块添加为依赖项,例如 "myModule": "1.x.x"。如果您现在要安装您的模块,您将拥有 "myModule v1.0.0",并且您的锁定文件将反映这一点。

现在将您的模块更新到 v1.1.0,然后重新安装您的模块。在这一点上,如果你没有锁定文件,你会得到 "myModule v1.1.0",但是因为锁定文件就像你的依赖树应该是什么样子的快照,你会坚持使用 "myModule v1.0.0" ].当然如果删除锁文件,会生成一个新的"myModule v1.1.0"。同样,更新 package.json 也会更新锁定文件。

  • 注意,我给出的示例是 npm 而不是 yarn,但概念是相同的。

关于 github 个问题的讨论很长 here. TLDR; The problem seems to be fixed in modern yarn