"Обновление 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>
должны дать вам правильную версию.