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

目前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将拉入最新的次要版本,但忽略任何预发行版本?

UPDATE

如果我尝试使用3.xx作为依赖项,则会出现同样的问题。 我希望这仍然可以让我通过小版本升级没有预发布版本,但事实并非如此:/

蒂尔德( ~3.8.12 )在技术上~3.8.12但是它是一个绷带。 “工作”的唯一原因是因为引入的重大更改是3.9.0-unstable并且代字号不允许npm跨小版本升级。 如果这些“不稳定的”变化在3.8.13-unstable中引入,那么即使在使用代字号时也会出现同样的问题。

更新2

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

semver没有指定一种方式来区分稳定和不稳定的版本。

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

不幸的是,任何一个semver操作符都会发生同样的情况,所以不能逃脱。

正如你所看到的,你最好使用特定的版本3.8.12

我会认为这里最简单的方法是使用代字符~

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

与“插入符号”的不同之处在于,“符号”将与3.8.x相匹配,其中“插入符号”匹配任何等于或高于指定版本的东西。