"Обновление npm" устанавливает бета-версию модуля поверх стабильной версии, установленной после установки "npm install",

В настоящее время пакет 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.x.x в качестве зависимости. Я надеялся, что все-таки разрешу мне обновляться через младшие версии без предварительных версий, но это не так:/

Тильда (~3.8.12) технически работает, но это бандайда. Единственная причина, по которой он "работает", состоит в том, что внесенные изменения изменяются в 3.9.0-unstable, а тильда не позволяет npm обновляться в младших версиях. Если эти "неустойчивые" изменения были введены в 3.8.13-unstable, то эта же проблема возникла бы даже при использовании тильды.

ОБНОВЛЕНИЕ 2

Я также попытался вручную указать "последний" тег: ^3.8.12-latest. Это ничего не меняло; npm update полностью игнорирует тег, даже если он явно указан в самом списке зависимостей:/

Ответы

Ответ 1

semver не указывает способ рассказать о стабильных и нестабильных версиях.

Как вы сказали, карет позволит обновить npm для установки любой версии 3.x.x, в то время как тильда разрешит любую версию 3.8.x, даже если следующая версия называется сломанной 3.8.13.

К сожалению, то же самое происходит с любым оператором semver, поэтому нет выхода.

Как вы видите, вам лучше использовать определенную версию 3.8.12.

Ответ 2

Я бы подумал, что самый простой подход здесь - использовать тильду ~

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

Отличие от "каретки" ^ заключается в том, что "тильда" будет соответствовать на 3.8.x, где "каретка" соответствует чему-либо равному или выше указанной версии.

Ответ 3

Просто для того, чтобы обновиться для тех, кто наткнулся на это, как я, я выполнил незначительный удар и опубликовал его, помеченный как бета, но через 10-15 минут после публикации npm установил по умолчанию эту бета-версию как последнюю, несмотря на то, что она была четко помечена,

Я думаю, что есть некоторое время на обновление таблицы semver, если вы дадите ей 10-15, ваши будущие попытки npm install <packagename> должны дать вам правильную версию.