目前的 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/