node.js - "npm update"正在安装模块的 beta 版本,而不是在 "npm install"之后安装的稳定版本

标签 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 看到它们有一个“latest”标签和一个“unstable”标签。

很明显 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 完全忽略标签,即使它明确地在依赖列表本身中:/

最佳答案

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

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

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

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

关于node.js - "npm update"正在安装模块的 beta 版本,而不是在 "npm install"之后安装的稳定版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24602648/

相关文章:

javascript - 如何在 Nexus 3 中迁移代理 NPM 存储库?

javascript - 在node.js中使用全局变量

java - 如何让java反射也采用依赖类?

javascript - 不能在 Windows 中将 GLOB 与 JSHint 一起使用?

linux - npm 安装出错

bash - 这个脚本有什么作用?

javascript - 如果解决时间超过 5 秒,是否可以拒绝 Promise.allSettled 中的每个 Promise?

javascript - 在node.js中的utils.js文件中创建全局变量

node.js - Jade 将空的 `style` 元素添加到 `head`

android - Lint : "Newer Library Versions Available" when using variables