Как обновить зависимости в package.json

Node.js

оригинал:medium.com/better-pro Страна…

Npm (Node Package Manager) — это менеджер пакетов для языка программирования JavaScript и менеджер пакетов по умолчанию для среды выполнения Node.js JavaScript.

В проекте его список зависимостей пакетов хранится вpackage.jsonв файле. Каждому установленному пакету присваивается номер версии, который обычно состоит из трех частей:major.minor.patch.

  • majorУказывает на несовместимое критическое изменение API.
  • minorУказывает на функциональное изменение для обратной совместимости.
  • patchУказывает на исправление ошибки с обратной совместимостью.

По умолчанию npm устанавливает последнюю версию, добавляя перед номером версии^каре, например "^15.2.0". Зависимость с этим символом означает, что должна быть установлена ​​как минимум версия 15.2.0.

Его можно использовать, когда существует более высокая основная версия. Допустим, у вас сейчас 15.6.2, вы обновитесь до этой версии при установке.

Если вы хотите быть более безопасным, используйте~тильда«~ 15.2.0» для обозначения только более поздних версий с исправлениями. Конечно, чистый «15.2.0» гарантирует, что будет использоваться только этот точный номер версии. Дополнительные сведения о номенклатуре семантического управления версиями см.semver.org/.

Все идет нормально.

Вот проблема

Звезды меняются, а зависимость возрастает. Что вы делаете, когда хотите обновить все пакеты, чтобы получить новые функции или исправить ошибки?

Сначала нужно определить, какая последняя версия. Вот пример на GitHub:

{
  "name": "npm_upgrading",
  "version": "1.0.0",
  "description": "A tutorial how to upgrade NPM packages",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "repository": {
    "type": "git",
    "url": "git+https://github.com/JenniferFuBook/npm_upgrading.git"
  },
  "author": "Jennifer Fu",
  "license": "ISC",
  "bugs": {
    "url": "https://github.com/JenniferFuBook/npm_upgrading/issues"
  },
  "homepage": "https://github.com/JenniferFuBook/npm_upgrading#readme",
  "dependencies": {
    "lodash": "~4.17.12",
    "prettier": "1.18.0",
    "react": "^15.2.0"
  }
}

Если у вас установлен «Version Lens» в VSCode, он покажет последнюю версию всех пакетов:

Или вы также можете использовать интерфейс командной строки npm:npm outdated

  • Currentтекущая установленная версия
  • Wantedудовлетворенpackage.jsonМаксимальная версия диапазона SemVer в
  • Latestэто версия пакета, помеченная последней в репозитории
  • Locationэто расположение пакета в дереве зависимостей, где он находится

Цвет пакета в выводе CLI указывает на срок действия. Красный означает совпадениеpackage.jsonТребование SemVer определено в более новой установленной версии; желтый цвет означает, что в репозитории есть более новая версия, чем требование SemVer.

В приведенном выше примереlodashСрок действия не истек, поэтому в списке нет. в то же время,Prettierотстает от последней версии в незначительной степени, в то время какReactнаходится в главном бите.

Если зависимости изменены следующим образом:

Красный маркер будет выделенLodashа такжеPrettier:

решение

После обнаружения устаревших пакетов исправляемpackage.jsonв соответствующих спецификациях версии. Тогда вы можете запуститьnpm installилиnpm updateобновить.

  • npm installустановит пакет и любые пакеты, от которых он зависит. если пакет существуетpackage-lockилиshrinkwrapфайл (последний имеет приоритет при сосуществовании), зависимости будут установлены против него.
  • npm updateВсе пакеты, присутствующие в списке зависимостей, будут обновлены, а также будут установлены отсутствующие пакеты.

Какая разница между двумя?

Во-первых, если версия установленного пакета удовлетворяетpackage.jsonспецификация SemVer, определенная вnpm installпроигнорирует его с запутанной политикой версий и не будет переустанавливать; иnpm updateОн по-прежнему будет обновлен до соответствующей последней версии.

Аннотация: Например, последняя версия библиотеки lodash на момент написания статьи —4.17.15, предполагая, что установленная версия4.17.14, затем запуститеnpm installне изменится послеnpm updateобновит его до4.17.15.

В то же время даdevDependenciesОбработка также отличается:

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

Слишком концептуально, не так ли? В качестве примера изменим версию Prettier с «1.18.0» на «~1.18.0»:

если работаетnpm install, Версия Prettier достаточно "нечеткая", чтобыpackage-lock.jsonсохранит исходный «1.18.0»:

бегатьnpm lsТакже см:

однако бежатьnpm updateназад,package-lock.jsonВерсия Prettier будет обновлена ​​до «1.8.2»:

npm lsВывод также обновляется:

Кроме того, зависимости Prettier в стиле тильды также были изменены на стиль вставки!

лучшее решение

Как упоминалось ранее, если спецификация SemVer использует объявление версии в виде тильды, дажеnpm updateОн также не обновляет свой основной номер версии напрямую. Эта стратегия обновления имеет смысл в ситуациях, когда изменения основных версий происходят часто и влекут за собой критические изменения, и к ней следует относиться с осторожностью.

Итак, что, если вы просто хотите обновить основную версию?

Использование VSCode вVersion LensПри добавлении плагина мы можем вручную обновить основную версию зависимого пакета в соответствии с его подсказками. Еще одним мощным инструментом являетсяnpm-check-updates, который выполняет ту же работу автоматически; инструмент npm можно установить глобально:

npm install -g npm-check-updates

Затем запустите:ncu -u

Сейчас,package.jsonЗависимости обновлены до последних, включая основные битовые обновления:

Остальное легко. бегатьnpm installилиnpm updateдля завершения обновления.

Используйте с осторожностьюnpm-check-updates-- Ведь с большой силой приходит и большая ответственность.



--End--

Посмотреть больше хороших статей о внешнем интерфейсе
Пожалуйста, найдите немного жизни и подпишитесь на публичный номер

Пожалуйста, укажите источник