为什么在 package.json 中增加版本后运行 yarn install 后,我的 yarn.lock 文件会发生变化?

15

我已经阅读了有关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文件。

那么,在什么情况下会实际使用锁定版本/这是否是使用yarn.lock的正确方式?

2个回答

1
如果您更改package.json中的依赖版本,锁定文件将会更新以反映这一点。锁定文件的目的是双重的。一方面,允许您(和您的同行)使用您知道可以工作并进行过测试的依赖项版本。另一方面,用于依赖项作者指定依赖项的依赖项要使用的版本。目标是稳定性。
如果您想玩一下并查看锁定文件的目的,请创建自己的npm模块并将其推送到npm注册表中,版本为v1.0.0。然后在您的项目中,使用类似“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,但概念相同。

18
目前情况是,即使您没有更改package.json文件,运行yarn install命令也会修改yarn.lock文件。我在从Node.js 13切换到14时看到了这种情况发生。 - zenw0lf
3
但你并没有告诉他/她任何新内容。这位@bitscuit声称yarn install仍会覆盖他当前的版本。 - masonCherry

1

在 Github 的 这里 有一场长时间的讨论。简而言之,问题似乎已经在 现代 yarn 中得到解决。


在我看来,它仍然存在,并且被“固定yarn版本”所掩盖(https://yarnpkg.com/cli/set/version),这是默认的并且在模板(CRA等)中完成的。 - Minh Nghĩa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接