“npm update”正在安装模块的 beta 版本,而不是在“npm install”之后安装的稳定版本

Posted

技术标签:

【中文标题】“npm update”正在安装模块的 beta 版本,而不是在“npm install”之后安装的稳定版本【英文标题】:"npm update" is installing a beta version of the module over the stable version that installed after "npm install" 【发布时间】:2014-08-27 11:11:53 【问题描述】:

目前 npm 包 mongoose 的版本为 3.8.12。运行npm install mongoose --save正确安装3.8.12版本,并将依赖保存到package.json,如下:

"dependencies": 
  "mongoose": "^3.8.12"

如果你查看node_modules/mongoose/package.json,你可以看到安装的版本确实是3.8.12。但是,如果我现在运行npm update,那么 npm 将继续安装不稳定版本的 mongoose (3.9.0)。我认为这是因为依赖项中的插入符号告诉 npm 继续升级次要版本(即 3.8 到 3.9)。没关系,除了我不想要任何预发布版本。如果我修改依赖项并删除插入符号,那么 npm update 将按预期工作,当然我现在必须手动升级依赖项版本,即使是次要和补丁更新。

你可以通过运行npm info mongoose看到他们有一个“最新”标签和一个“不稳定”标签。

很明显npm install 除非另有说明,否则使用最新版本,而npm update 则完全忽略标签并获取它所知道的最新次要版本。

有没有办法修改依赖,所以npm update 会拉入最新的次要版本,但忽略任何预发布版本?

更新

如果我尝试使用 3.x.x 作为依赖项,也会出现同样的问题。我希望这仍然允许我在没有预发布版本的情况下通过次要版本进行升级,但事实并非如此:/

波浪号 (~3.8.12) 在技术上有效,但它是一个创可贴。它“有效”的唯一原因是因为引入的重大更改位于 3.9.0-unstable 中,并且波浪号不允许 npm 跨次要版本升级。如果在 3.8.13-unstable 中引入了这些“不稳定”更改,那么即使使用波浪号也会出现同样的问题。

更新 2

我还尝试手动指定“最新”标签:^3.8.12-latest。这并没有改变任何东西。 npm update 完全忽略标签,即使它明确地在依赖列表本身中:/

【问题讨论】:

可能与最近的错误有关。试试npm -g install npm,然后再试一次。 【参考方案1】:

我认为这里最简单的方法是使用波浪号 ~

"dependencies": 
  "mongoose": "~3.8.12"

与“插入符号”^ 的区别在于“波浪符号”将匹配 3.8.x,其中“插入符号”匹配等于或高于指定版本的任何内容。

【讨论】:

Caret 是指定版本之上的任何次要版本。波浪号是一样的,但对于补丁版本。我绝对可以使用波浪号并“解决”问题,但这只是因为在 3.9.0-unstable 版本而不是 3.8.13-unstable 版本中引入了重大更改。如果是后者,那么即使波浪号也无济于事:(。如果我可以让npm update 忽略“最新”以外的任何标签,那将是更可取的。【参考方案2】:

semver 没有指定区分稳定和不稳定版本的方法。

正如你所说,插入符号将允许 npm update 安装任何 3.xx 版本,而波浪号将允许任何 3.8.x 版本即使下一个版本被称为3.8.13-broken

遗憾的是,任何 semver 运算符都会发生同样的情况,因此没有转义。

如您所见,您最好使用特定版本3.8.12

【讨论】:

查看semver documentation了解更多详情。 我已经看过很多了,但它有点神秘。感谢您确认我怀疑这只是 npm 的疏忽 :)【参考方案3】:

只是为了像我一样偶然发现这个问题的人更新,我做了一个小的 semver 碰撞并将其发布为 beta,但在发布后的 10-15 分钟内,npm 安装默认为最新的这个 beta,尽管它被清楚地标记。

我认为更新 semver 表有一些滞后时间,如果你给它 10-15,你未来的npm install <packagename> 尝试应该会给你正确的版本。

【讨论】:

以上是关于“npm update”正在安装模块的 beta 版本,而不是在“npm install”之后安装的稳定版本的主要内容,如果未能解决你的问题,请参考以下文章

npm update 会使用 npm 缓存吗?

ZendDeveloperTools模块没有在ZF2 beta5中显示工具栏

Xcode 5 安装 Xcode 6 beta 2 后无法构建模块 Cocoa

在 npm update 后运行 npm ls <package name> 不显示更新版本?

Angular Browserslist:caniuse-lite 已过时。请运行下一个命令`npm update`

npm update 不尊重 npm outdated 的结果