npm проверка и обновление пакета при необходимости
Описание проблемы:
Мне нужно интегрировать тестовый.runner Karma в TeamCity, и для этого я хочу предоставить системным инженерам небольшой скрипт (PowerShell или любой другой), который бы выполнял следующие действия:
- Извлекал нужный номер версии из конфигурационного файла (я предполагаю, что могу указать его в виде комментария прямо в файле
karma.conf.js
). - Проверял, установлена ли определенная версия Karma runner в глобальном репозитории npm.
- Если она не установлена или установлена версия старше желаемой, подбирал и устанавливал нужную версию.
- Запускал команду:
karma start .\Scripts-Tests\karma.conf.js --reporters teamcity --single-run
.
Так что мой основной вопрос заключается в следующем: "как в скрипте проверить, установлена ли нужная версия пакета?" Нужно ли проводить проверку, или безопасно просто каждый раз вызывать команду npm -g install
?
Я не хочу постоянно проверять и устанавливать последнюю доступную версию, так как другие значения конфигурации могут стать несовместимыми.
5 ответ(ов)
Один простой шаг:
$ npm i -g npm-check-updates && ncu -u && npm i
И это всё. Все версии пакетов в вашем package.json
будут обновлены до последних мажорных версий.
Что происходит здесь?
- Устанавливается пакет, который проверяет обновления для вас.
- Используется этот пакет для обновления всех версий пакетов в вашем
package.json
(флаг-u
— это сокращение для--updateAll
). - Устанавливаются все новые версии пакетов.
Чтобы обновить одну локальную зависимость, выполните следующие шаги:
Сначала узнайте, какие пакеты требуют обновления, выполнив команду:
npm outdated
Затем обновите нужный пакет вручную с помощью команды:
npm update --save <имя_пакета>
Таким образом, нет необходимости вручную обновлять файл package.json
.
Обратите внимание, что указанная команда обновит пакет до последней версии.
Если вы укажете какую-то версию в файле package.json
и выполните команду:
npm update <имя_пакета>
В этом случае вы получите только следующую стабильную версию (желаемую) в соответствии с тем, что указано в вашем package.json
.
Кроме того, с помощью команды npm list <имя_пакета>
вы можете узнать текущую версию вашего локального пакета.
Чтобы проверить устаревшие пакеты и обновить только те, которые нуждаются в обновлении, можно использовать следующую команду:
npm install $(npm outdated | cut -d' ' -f 1 | sed '1d' | xargs -I '$' echo '$@latest' | xargs echo)
Эта команда сначала получает список устаревших пакетов, извлекает их имена, пропускает заголовок и формирует команду для их обновления до последней версии. Просто выполните её в терминале вашего проекта, и устаревшие пакеты будут обновлены без установки дополнительных пакетов.
Команды NPM для обновления или исправления уязвимостей в файлах зависимостей
- Чтобы проверить устаревшие или уязвимые зависимости в ваших node модулях, используйте следующую команду:
npm audit
- Если будут обнаружены уязвимости, выполните следующую команду для исправления всех проблем:
npm audit fix
- Если это не сработало, попробуйте:
npm audit fix -f
Эта команда почти всегда исправляет все уязвимости. Некоторые зависимости или devDependencies могут быть заблокированы в файле package-lock.json, поэтому мы используем флаг -f
, чтобы принудительно обновить их.
- Если вы не хотите использовать принудительное исправление уязвимостей, вы можете вручную изменить версии ваших зависимостей в файлах package-lock.json и package.json. Затем выполните:
npm update && npm upgrade
При установке npm-пакетов (как глобально, так и локально) вы можете указать конкретную версию, используя синтаксис @version
. Например, команда:
npm install -g [email protected]
гарантирует, что будет установлена только версия 0.9.2, и она не будет переустановлена, если уже существует.
В качестве совета, я бы рекомендовал избегать глобальных установок npm там, где это возможно. Многие люди не осознают, что если зависимость определяет файл bin, он устанавливается в ./node_modules/.bin/
. Часто бывает очень удобно использовать именно эту локальную версию установленного модуля, которая определена в вашем файле package.json
. На самом деле, npm-скрипты добавляют ./node_modules/.bin
в ваш путь.
Вот пример package.json
, который при выполнении команды npm install && npm test
установит версию karma, определенную в вашем package.json
, и использует эту версию karma (установленную в node_modules/.bin/karma
) при запуске скрипта test
:
{
"name": "myApp",
"main": "app.js",
"scripts": {
"test": "karma test/*"
},
"dependencies": {...},
"devDependencies": {
"karma": "0.9.2"
}
}
Это позволяет вашему package.json
определять версию karma, которую нужно использовать, и не требуется поддерживать эту конфигурацию глобально на вашей CI-платформе.
В чем разница между тильдой (~) и каретом (^) в package.json?
Как удалить модули npm в Node.js?
Как предотвратить установку "devDependencies" модулей NPM для Node.js (package.json)?
Ошибка "npm WARN package.json: Нет поля repository"
nvm постоянно "забывает" Node.js в новой сессии терминала