" npm update"正在安装一个测试版的模块,而不是在" npm install"之后安装的稳定版本。

时间:2014-07-07 03:27:42

标签: node.js dependencies npm versioning dependency-management

目前,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作为依赖项,则会出现同样的问题。我希望这仍然允许我在没有预发布版本的情况下通过次要版本进行升级,但事实并非如此:/

Tilde(3.9.0-unstable)在技术上有效,但它是一个绑带。这是"工作的唯一原因"是因为引入的重大变化是在3.8.13-unstable中,并且代字号不允许npm在次要版本之间升级。如果这些"不稳定"在^3.8.12-latest中引入了更改,即使使用代字号也会出现同样的问题。

更新2

我也试过手动指定"最新的"标签:npm update。这并没有改变任何事情; {{1}}完全忽略标记,即使它在依赖项列表中明确显示:/

3 个答案:

答案 0 :(得分:6)

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

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

可悲的是,任何 semver 运算符都会发生同样的情况,因此无法逃脱。

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

答案 1 :(得分:3)

我原本认为这里最简单的方法是使用代字号~

"dependencies": {
  "mongoose": "~3.8.12"
}

与"插入符号的区别" ^是"代字号"将匹配3.8.x" caret"匹配任何等于或高于指定版本的内容。

答案 2 :(得分:1)

只是为像我一样偶然发现此问题的任何人进行更新,我做了一个小小的修改,并将其标记为beta版本,但是在发布后的10-15分钟内,npm安装程序默认将其默认为该beta版本。被清楚地标记。

我认为更新semver表会有些滞后,如果您给它10-15,那么将来的npm install <packagename>尝试将为您提供正确的版本。