为什么运行 `yarn update` 不会更新我的 `package.json`
为什么运行yarn upgrade
不会更新我的package.json
为什么运行yarn upgrade
不会更新我的package.json
今天我想升级我的一个项目的 React 依赖项。所以我运行了
yarn upgrade react
看起来每个人都很开心。
然后我检查了我的package.json
,没有任何变化。
"react" "^16.5.1",
"react-dom": "^16.5.1",
我在 Google 上的第一个问题是“yarn 升级无法更新 package.json”。一些搜索结果似乎表明 Yarn 早期版本存在 bug。但问题似乎并没有得到解决。
Yarn 的官方文档明确指出,运行这样的命令应该会更新此处的依赖关系。
然后我检查了一下yarn.lock
,发现我的升级包的最新版本已经安装了。
为什么,为什么,为什么🤷🏻♀️
我粗略地了解了这里可能发生的情况。当前版本react@^16.5.1
接受升级后的版本16.8.6
,如所示yarn.lock
。
但是,在这种语义情况下,我应该如何正确升级依赖项呢?也就是说,将依赖项升级到最新版本,并表明我的应用现在依赖于该版本?
我的意思是,除了手动更改之外package.json
?
我尝试了一些方法。有些方法显然方向不对,但它们确实有助于我更好地理解情况。
了解语义版本控制范围
我们中安装的版本node_modules
可能不是我们在 中看到的文字数字package.json
。这是因为我们指示的版本可能是一个范围。
例如,插入符号范围指定如下:
允许不修改版本中第一个非零数字的更改,无论是 3.1.4 中的 3 还是 0.4.2 中的 4。
通过运行添加包时,默认使用插入符号范围
$ yarn add package-name
这将安装具有最新稳定版本的软件包,并且 Yarnpackage.json
使用插入符号范围写入该版本。
如果我理解正确的话,似乎如果我yarn
将来运行我的包,或者其他包依赖于更高版本,只要它满足范围,它就会使用更高版本。
语义版本控制有更多范围:
您可以在此处阅读 Yarn 的文档,或在此处阅读 NPM 的文档。
理解命令yarn upgrade
所以我今天学到的是,跑步yarn upgrade
并不一定会package.json
像我想象的那样更新。
yarn upgrade
(不带修饰语)
没有任何修饰符的运行yarn upgrade
不会更新package.json
。
如果我们在运行时不带任何标志,它将安装与 指示的版本模式匹配的yarn upgrade
最新版本。并且它不会更新。 package.json
package.json
yarn upgrade
依赖关系:在tilde 范围内"react": "~16.5.1"
安装最新版本~16.5.1
16.5.2
yarn upgrade
依赖关系:在插入符号范围内安装截至今天的"react": "^16.5.1"
最新版本~16.5.1
16.8.6
yarn upgrade
完全依赖"react": "16.5.1"
根本不安装任何新东西🧐
yarn upgrade --latest
当最新的稳定版本不再符合当前范围时,运行yarn upgrade
可能会更新。package.json
但它仍然可能无法更新package.json
。具体来说,当最新版本与中指示的语义版本范围匹配时package.json
。
yarn upgrade --latest
依赖:安装今天的"react": "~16.5.1"
最新版本,并更新到16.8.6
package.json
"react": ~16.8.6"
yarn upgrade --latest
依赖:安装今天的"react": "^16.5.1"
最新版本,并更新到16.8.6
package.json
"react": ^16.8.6"
yarn upgrade --latest
根据确切的依赖关系安装截至今天的"react": "16.5.1"
最新版本,并更新至16.8.6
package.json
"react": 16.8.6"
如果我想升级到某个版本并更新,该怎么办package.json
如果要处理一个连小版本都敏感的库,最好指定一个更严格的版本范围,甚至是精确的版本范围。然后使用 进行升级--latest
。
除此之外,在尝试了几个命令之后,我发现这个命令很有趣,并且在这种情况下最直接:
$ yarn upgrade react@^
这将弹出一个交互式的版本列表供您选择。安装完成后,它会package.json
再次更新到所选版本,并以插入符号范围显示。
总结
对于版本敏感的库(例如 Flow??? 🙈),请指示版本依赖性,但不带任何范围。
使用yarn upgrade package@[version]
也许是升级软件包的实际操作最直观的方式。