оригинал: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--
Посмотреть больше хороших статей о внешнем интерфейсе
Пожалуйста, найдите немного жизни и подпишитесь на публичный номер
Пожалуйста, укажите источник