Установка npm против обновления - какая разница?


Ответы:


655

Разница между НПМ установки и НПМ обновление обработки версий пакетов , указанных в package.json :

{
  "name":          "my-project",
  "version":       "1.0",                             // install   update
  "dependencies":  {                                  // ------------------
    "already-installed-versionless-module":  "*",     // ignores   "1.0" -> "1.1"
    "already-installed-semver-module":       "^1.4.3" // ignores   "1.4.3" -> "1.5.2"
    "already-installed-versioned-module":    "3.4.1"  // ignores   ignores
    "not-yet-installed-versionless-module":  "*",     // installs  installs
    "not-yet-installed-semver-module":       "^4.2.1" // installs  installs
    "not-yet-installed-versioned-module":    "2.7.8"  // installs  installs
  }
}

Резюме : единственная большая разница в том, что уже установленный модуль с нечетким управлением версиями ...

  • игнорируется npm install
  • обновляется npm update

Дополнительно : installи updateпо умолчанию обрабатывают devDependencies по-другому

  • npm installбудет устанавливать / обновлять devDependencies , если --productionне будет добавлен флаг
  • npm updateбудет игнорировать devDependencies, если --devфлаг не добавлен

Зачем npm installвообще использовать ?

Потому что npm installделает больше, когда вы смотрите, кроме обработки ваших зависимостей в package.json. Как вы можете видеть в npm install, вы можете ...

  • установить узлы-модули вручную
  • установить их как глобальные (что помещает их в оболочку PATH), используяnpm install -g <name>
  • установить определенные версии, описанные тегами git
  • установить с Git URL
  • принудительно переустановить с --force

20
а как насчет ~1.3?
Offirmo

6
что если версия похожа на ^ 5.0.9? И возможно ли сделать npm install --save somePackageсохранение * в зависимости?
KwiZ

5
Я также хотел бы отметить, что такие скрипты, как postinstallзапускаются при установке, но не при обновлении.
Майкл Марвик

2
Если installи по- updateразному работают с URL-адресами git, тегами git и т. Д., Указанными в package.jsonтогда, было бы здорово добавить эти примеры в пример.
Joeytwiddle

2
@Offirmo тильды в нечетких средств контроля версий «обновление до последней минор (багфикс) выпуска этого пакета», минорной версии будучи последний номер в версии, т.е. 1.3.0 -> 1.3.1Это похоже ^1.3.0, где ^обновления основной версии, то есть 1.3.0 -> 1.4.0.
Боян Кушлев

82

npm install устанавливает все модули, указанные в package.jsonфайле и их зависимости.

npm update обновляет все пакеты в node_modulesкаталоге и их зависимости.

npm install express устанавливает только экспресс-модуль и его зависимости.

npm update express update express module (начиная с npm@2.x, он не обновляет свои зависимости).

Таким образом, обновления предназначены для тех случаев, когда у вас уже есть модуль и вы хотите получить новую версию.


5
если вы не укажете конкретную версию в файле package.json, npm install получит последнюю версию модуля. Так что это своего рода обновление.
Сед

11
Так что я должен использовать, npm installили npm update? Или, другими словами, я сейчас использую npm installи, похоже, также обновляю, есть ли какая-то причина, почему я должен когда-либо использовать npm update?
Борек Бернард

4
Так updateчто всегда будет обновляться до последней версии, независимо от package.json, и installбудет ли уважать версию, указанную в package.json?
Борек Бернард

1
updateустанавливает (или обновляет) последнюю версию модуля. installустанавливает последнюю версию модуля, если он не представлен, в противном случае сохраняет текущую версию.
Tenphi

11
@Borek обновится npm updateдо последней версии на основе вашего package.json, не зависимо от этого. Если у вас есть «express»: «3.x» и вы используете версию 3.1.0, он обновится до последней версии 3.x. Если есть версия 4.x, она не установит последнюю версию.
gcochard

47

В большинстве случаев будет установлена ​​последняя версия модуля, опубликованная на npm.

npm install express --save

или лучше обновить модуль до последней версии:

npm install express@latest --save --force

--save: Пакет появится в ваших зависимостях.

Больше информации: npm-install


11
npm install express@latest --save --forceбыло именно то, что я хотел.
ThomasReggi

2
В большинстве случаев? Какие-нибудь другие случаи?
Дмитрий Зайцев

9

Многие различия уже были упомянуты. Вот еще один:

Запуск npm installв верхней части исходного каталога будет запускать различные сценарии: prepublish, preinstall, install, postinstall. В зависимости от того, что делают эти сценарии, a npm installможет выполнять значительно больше работы, чем просто установка зависимостей.

У меня только что был случай использования, где prepublishбы позвонить makeиMakefile был разработан для получения зависимостей, если они package.jsonбыли обновлены. Вызов npm installизнутри Makefileпривел бы к бесконечной рекурсии, в то время как вызов npm updateработал просто отлично, устанавливая все зависимости, чтобы сборка могла продолжаться, даже если makeвызывался напрямую.


1
Одним из следствий этого является то, что если вы обновите, например, ваш redisмодуль и other_moduleвам потребуется более старая версия redis, npm install other_moduleвы гарантированно other_moduleбудете использовать более старую версию. Это может добавить в other_module/node_modules/redisслучае необходимости.
Jlukanta

4

npm update: установите и обновите последние модули узлов, которые находятся в package.json

npm install: установить модули узлов, которые определены в package.json (без обновления)


Используя npm версии 6.9.0, я наблюдаю следующее поведение: пропущено npm updateбольшое количество зависимостей в package-lock.json. Чтобы все необходимые пакеты были доступны и package-lock.jsonбыли правильными, мне всегда нужно выполнять npm installсразу после npm update.
Манфред
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.