Nodejs的项目会带一个package.json文件,里面列举了此项目依赖的各种包(通常安置在node_modules目录下可以找到),并且每个包要指明其版本号。包的版本号使用Semantic Versioning的方式命名,参考 About semantic versioning,下面是文档中带的例子:

  • Patch releases: 1.0 or 1.0.x or ~1.0.4
  • Minor releases: 1 or 1.x or ^1.0.4
  • Major releases: * or x

默认情况下,package.json里面指定的都是Minor releases,比如:

    "postcss": "^7.0.18",

上面指定的postcss的版本其实是一个范围,可以匹配(>= 7.0.18)以及(<8.0.0)的范围内的版本。 这里面指定的范围说实话有点大。版本范围过大有可能会导致软件包的依赖出现问题(比如这个问题

另外,在使用yarn等软件包管理工具的时候,会生成yarn.lock文件。在package.json中指定过大的版本范围,会导致一种情况,那就是yarn.lock中的软件bao版本升级了,而package.json却没有动静。使用 yarn upgrade或者yarn upgrade --latest之类的命令都不起效果。

Why Running yarn upgrade Does Not Update My package.json这篇文章对这个问题有较深入的探讨,指出的办法是使用:

$ yarn upgrade react@^
# 或者
$ yarn upgrade package@[version]

另一篇文章yarn upgrade does not update package.json | SOLUTION所指出的办法是:

# 先执行
yarn upgrade react react-dom jest-dom css-loader
# 后执行
yarn add react react-dom jest-dom css-loader

此外,还可以使用yarn-upgrade-all来解决这个问题。它的办法是先删除包,再添加。

其他参考

(完)