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